Lining Up and PaddingTwo Similar Lists

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • W. eWatson

    Lining Up and PaddingTwo Similar Lists

    Maybe there's some function like zip or map that does this. If not, it's
    probably fairly easy to do with push and pop. I'm just checking to see if
    there's not some known simple single function that does what I want. Here's
    what I'm trying to do.

    I have a list dat like (assume the items are strings even thought I'm
    omitting quotes.):
    [a.dat, c.dat, g.dat, k.dat, p.dat]

    I have another list called txt that looks like:
    [a.txt, b.txt, g.txt, k.txt r.txt, w.txt]

    What I need is to pair up items with the same prefix and use "None", or some
    marker, to indicate the absence of the opposite item. That is, in non-list
    form, I want:
    a.dat a.txt
    None b.txt
    c.dat None
    g.dat g.txt
    k.dat k.txt
    p.dat None
    None r.txt
    None w.txt

    Ultimately, what I'm doing is to find the missing member of pairs.
    --
    Wayne Watson (Watson Adventures, Prop., Nevada City, CA)

    (121.015 Deg. W, 39.262 Deg. N) GMT-8 hr std. time)
    Obz Site: 39° 15' 7" N, 121° 2' 32" W, 2700 feet

    Web Page: <www.speckledwi thstars.net/>
  • castironpi

    #2
    Re: Lining Up and PaddingTwo Similar Lists

    On Aug 28, 10:50 pm, "W. eWatson" <notval...@sbcg lobal.netwrote:
    Maybe there's some function like zip or map that does this. If not, it's
    probably fairly easy to do with push and pop. I'm just checking to see if
    there's not some known simple single function that does what I want. Here's
    what I'm trying to do.
    >
    I have a list dat like (assume the items are strings even thought I'm
    omitting quotes.):
    [a.dat, c.dat, g.dat, k.dat, p.dat]
    >
    I have another list called txt that looks like:
    [a.txt, b.txt, g.txt, k.txt r.txt, w.txt]
    >
    What I need is to pair up items with the same prefix and use "None", or some
    marker, to indicate the absence of the opposite item. That is, in non-list
    form, I want:
    a.dat a.txt
    None  b.txt
    c.dat None
    g.dat g.txt
    k.dat k.txt
    p.dat  None
    None  r.txt
    None  w.txt
    >
    Ultimately, what I'm doing is to find the missing member of pairs.
    --
                Wayne Watson (Watson Adventures, Prop., Nevada City, CA)
    >
                  (121.015 Deg. W, 39.262 Deg. N) GMT-8 hr std.time)
                   Obz Site:  39° 15' 7" N, 121° 2' 32"W, 2700 feet
    >
                         Web Page: <www.speckledwi thstars.net/>
    This gets you your list. What do you mean by 'missing member of
    pairs'? If you mean, 'set of elements that appear in both' or 'set
    that appears in one but not both', you can short circuit it at line
    14.

    -warning, spoiler-

    dat= ['a.dat', 'c.dat', 'g.dat', 'k.dat', 'p.dat']
    dat.sort()
    txt= ['a.txt', 'b.txt', 'g.txt', 'k.txt', 'r.txt', 'w.txt']
    txt.sort()
    import os.path
    datD= {}
    for d in dat:
    r,_= os.path.splitex t( d )
    datD[ r ]= d
    txtD= {}
    for d in txt:
    r,_= os.path.splitex t( d )
    txtD[ r ]= d
    both= sorted( list( set( datD.keys() )| set( txtD.keys() ) ) )

    print datD
    print txtD
    print both

    for i, x in enumerate( both ):
    both[ i ]= datD.get( x, None ), txtD.get( x, None )

    print both

    OUTPUT:

    {'a': 'a.dat', 'p': 'p.dat', 'c': 'c.dat', 'k': 'k.dat', 'g': 'g.dat'}
    {'a': 'a.txt', 'b': 'b.txt', 'g': 'g.txt', 'k': 'k.txt', 'r': 'r.txt',
    'w': 'w.t
    xt'}
    ['a', 'b', 'c', 'g', 'k', 'p', 'r', 'w']
    [('a.dat', 'a.txt'), (None, 'b.txt'), ('c.dat', None), ('g.dat',
    'g.txt'), ('k.d
    at', 'k.txt'), ('p.dat', None), (None, 'r.txt'), (None, 'w.txt')]

    Comment

    • Paul Rubin

      #3
      Re: Lining Up and PaddingTwo Similar Lists

      "W. eWatson" <notvalid2@sbcg lobal.netwrites :
      [a.dat, c.dat, g.dat, k.dat, p.dat]
      [a.txt, b.txt, g.txt, k.txt r.txt, w.txt]
      >
      What I need is to pair up items with the same prefix and use "None",
      or some marker, to indicate the absence of the opposite item.
      This is functionally influenced but should be straightforward :

      dat = ['a.dat', 'c.dat', 'g.dat', 'k.dat', 'p.dat']
      txt = ['a.txt', 'b.txt', 'g.txt', 'k.txt', 'r.txt', 'w.txt']

      # just get the portion of the filename before the first period
      def prefix(filename ):
      return filename[:filename.find( '.')]

      # make a dictionary mapping prefixes to filenames
      def make_dict(plist ):
      return dict((prefix(a) ,a) for a in plist)

      pdat = make_dict(dat)
      ptxt = make_dict(txt)

      # get a list of all the prefixes, use "set" to remove
      # duplicates, then sort the result and look up each prefix.
      for p in sorted(set(pdat .keys() + ptxt.keys())):
      print pdat.get(p), ptxt.get(p)

      Comment

      • Boris Borcic

        #4
        Re: Lining Up and PaddingTwo Similar Lists

        D,T=[dict((x.split(' .')[0],x) for x in X) for X in (dat,txt)]
        for k in sorted(set(D).u nion(T)) :
        for S in D,T :
        print '%-8s' % S.get(k,'None') ,
        print

        HTH

        W. eWatson wrote:
        Maybe there's some function like zip or map that does this. If not, it's
        probably fairly easy to do with push and pop. I'm just checking to see
        if there's not some known simple single function that does what I want.
        Here's what I'm trying to do.
        >
        I have a list dat like (assume the items are strings even thought I'm
        omitting quotes.):
        [a.dat, c.dat, g.dat, k.dat, p.dat]
        >
        I have another list called txt that looks like:
        [a.txt, b.txt, g.txt, k.txt r.txt, w.txt]
        >
        What I need is to pair up items with the same prefix and use "None", or
        some marker, to indicate the absence of the opposite item. That is, in
        non-list form, I want:
        a.dat a.txt
        None b.txt
        c.dat None
        g.dat g.txt
        k.dat k.txt
        p.dat None
        None r.txt
        None w.txt
        >
        Ultimately, what I'm doing is to find the missing member of pairs.

        Comment

        • W. eWatson

          #5
          Re: Lining Up and PaddingTwo Similar Lists

          castironpi wrote:
          ....
          >
          I don't think that's guaranteed by anything. I realized that
          'dat.sort()' and 'txt.sort()' weren't necessary, since their contents
          are moved to a dictionary, which isn't sorted.
          Actually, I'm getting the file names from listdir, and they appear to be
          sorted low to high. I tried it on a folder with lots of dissimilar files.
          >
          both= set( datD.keys() )& set( txtD.keys() )
          >
          This will get you the keys (prefixes) that are in both. Then for
          every prefix if it's not in 'both', you can report it.
          >
          Lastly, since you suggest you're guaranteed that 'txt' will all share
          the same extension, you can do away with the dictionary and use sets
          entirely. Only if you can depend on that assumption.
          Each dat file contains an image, and its description and related parameters
          are in the corresponding txt file.
          >
          I took a look at this. It's probably more what you had in mind, and
          the dictionaries are overkill.
          ....

          Comment

          • George Sakkis

            #6
            Re: Lining Up and PaddingTwo Similar Lists

            On Aug 29, 1:29 am, "W. eWatson" <notval...@sbcg lobal.netwrote:
            It looks like I have a few new features to learn about in Python. In particular,
            dictionaries.
            In Python it's hard to think of many non-trivial problems that you
            *don't* have to know about dictionaries.

            George

            Comment

            Working...