简体   繁体   English

比较和替换嵌套列表的元素

[英]comparing and replacing the elements of a nested list

I have got a list which is: 我有一个列表是:

mylist = {
           'a': [(-1,-1), (0.2,0.4)] 
           'b': [(0.3,1.0), (-1,-1)]
           'c': [(-1,-1), (-1,-1)]
           'd': [(0.15,0.35), (0.05,0.15)]
          }

I have to get an output which will be like the following: 我必须得到如下输出:

 mylist = {
           'a': [(0.3, 0.35), (0.2,0.4)] 
           'b': [(0.3,0.35), (0.05,0.15)]
           'c': [(0.15,0.35), (0.05,0.15)]
           'd': [(0.15,0.35), (0.05,0.15)]
          }

The list above looks like this when I print it, 上面的列表在我打印时看起来像这样,

mylist = [ ('a', [ (-1, -1), (0.2, 0.4) ] ), 
           ('b', [ (0.3, 1.0), (-1, -1) ] ), 
           ('c', [ (-1, -1), (-1, -1) ] ), 
           ('d', [ (0.15, 0.35), (0.05, 0.15) ] ) ]

Now the algorithm is like the following: 现在的算法如下:

1st iteration: Compare a[0] and b[0] ie (-1, -1) and (0.3, 1.0). 
               Here replace (-1, -1) by (0.3, 1.0). 
               Rule: (-1, -1) is considered as empty or not in use so 
                     it gets replaced while comparison. 

               Similarly, compare a[1] and b[1] ie (0.2, 0.4) and (-1, -1). 
               Here keep the same value as b[1] is empty so no change. 

               Hence the new elements of 'a' are (0.3, 1.0), (0.2, 0.4). 
               Rule: if comparing with empty one then keep the same values.

2nd iteration: Compare new values of a[0] and c[0] ie (0.3, 1.0) and (-1, -1). 
               Here again no change. 
               Similarly, compare new values of a[1] and c[1] ie (0.2, 0.4) and (-1, -1).
               Here also no change. 
               Now the new elements of 'a' are (0.3, 1.0), (0.2, 0.4).

This process carries till 'a' is compared to the last element in the list here its upto 'd'. 此过程一直进行到将“ a”与列表中的最后一个元素(直到“ d”)进行比较为止。 Then comes the turn of 'b' and same thing will continue between 'b' and 'c' then 'b and 'd' and so on. 然后是“ b”的转弯,相同的事物将在“ b”和“ c”之间继续,然后是“ b和” d”,依此类推。

The other rules when comparison between two actual ranges (0.1,0.3) and (0.5,1.0). 在两个实际范围(0.1,0.3)和(0.5,1.0)之间进行比较时的其他规则。

Say if two ranges totally overlap like (0.1, 0.8) and (0.3, 0.9) then, it should take the common between them which is (0.3, 0.8). 假设两个范围完全重叠,如(0.1,0.8)和(0.3,0.9),则它们之间的共同点应该是(0.3,0.8)。

If they don't overlap like (0.1, 0.4) and (0.5, 0.9) then, it should choose its own which is (0.1, 0.4). 如果它们不像(0.1,0.4)和(0.5,0.9)那样重叠,则应选择自己的(0.1,0.4)。

And if they partially overlap then also take the common between them. 如果它们部分重叠,那么它们之间也可以共用。 Like (0.4, 1.0) and (0.8, 1.5) then it should choose (0.8, 1.0). 像(0.4,1.0)和(0.8,1.5)一样,它应该选择(0.8,1.0)。

PS The values (0.2, 0.4) are the ranges actually indicating the actual value will vary between 0.2 to 0.4. PS值(0.2,0.4)是实际指示的范围,实际值将在0.2到0.4之间变化。 I think now I have explained a bit more clearly. 我想现在我已经解释得更清楚了。 Thank you 谢谢

def update(mylist, row, col, cmprow, cmpcol):
    lo, hi = mylist[row][col]
    low, high = mylist[cmprow][cmpcol]

    # always replace the current value if it's (-1, -1)
    if (lo, hi) == (-1, -1):
        mylist[row][col] = low, high
        print "replacing empty", row, col, "with", cmprow, cmpcol
        return

    # never replace the current value if the ranges don't overlap
    # or the other range is (-1, -1)
    if (low, high) == (-1, -1) or lo >= high or hi <= low:
        print row, col, "doesn't overlap", cmprow, cmpcol
        return

    # set the low to the highest low and the high to the lowest high
    print "updating", row, col, "with", cmprow, cmpcol
    mylist[row][col] = max((lo, low)), min((hi, high))



def update_ranges(oldlist):
    # make a copy of the list as we're going to modify it
    mylist = oldlist[:]
    # we don't need the row titles, they just complicate things
    rowtitles, mylist = zip(*mylist)
    rows = len(mylist)
    columns = range(len(mylist[0]))

    # for each row except the last
    for i in xrange(rows - 1):
        # update it by going down all the rows below it
        for k in xrange(i+1, rows):
            # for both columns
            for j in columns:
                update(mylist, i, j, k, j)

    # put the row titles back in
    mylist = zip(rowtitles, mylist)
    return mylist



def test():
    oldlist = [ ('a', [ (-1, -1), (0.2, 0.4) ] ),
               ('b', [ (0.3, 1.0), (-1, -1) ] ),
               ('c', [ (-1, -1), (-1, -1) ] ),
               ('d', [ (0.15, 0.35), (0.05, 0.15) ] ) ]
    print "Original List"
    print '\n'.join(str(l) for l in oldlist)
    newlist = update_ranges(oldlist)
    print "New List"
    print '\n'.join(str(l) for l in newlist)

if __name__ == '__main__':
    test()

Edit: Updated update_ranges to work for any number of columns. 编辑:更新了update_ranges以使其可用于任意数量的列。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM