比较两个元组列表以创建包含最高值的新元组

时间:2015-01-22 17:01:30

标签: python list tuples

我有以下代码,它将比较两个词典bc,并创建一个名为d的第三个词典,其中包含比较bc并取得最高分:

b = {1:0,2:0,3:0,4:0,5:0}
c = {1:1,4:4,5:5}

d={k:c[k] if k in c and c[k]>b[k] else v for k,v in b.items()}

但是,由于字典未排序,我必须使用以下语法将bc转换为元组,然后再进行比较,以便它们按正确顺序排列:

b = sorted(b.iteritems()) 
c = sorted(c.iteritems()) 

这会产生一个输出:

b = [(1,0),(2,0),(3,0),(4,0),(5,0)]
c = [(1,1),(4,4),(5,5)]

但是我现在不确定如何比较两个元组并产生一个如下所示的输出:

d = [(1,1),(2,0),(3,0),(4,4),(5,5)]

在Python 2.7中似乎没有可用的元组理解,除非我没有在正确的位置寻找答案。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

为什么不能对d的项目进行排序?

b = {1:0, 2:0, 3:0, 4:0, 5:0}
c = {1:1, 4:4, 5:5}

d = {k: c[k] if k in c and c[k] > b[k] else v for k, v in b.items()}
sorted(d.items())

我想这意味着您知道c的密钥是b中密钥的子集。如果这不是真的,你需要得到键的并集,并比较每个字典的值:

b = {1:0, 2:0, 3:0, 5:0}
c = {1:1, 4:4, 5:5}  # note, 4 not in "b"
ninf = -float('inf')  # some value smaller than all others.
all_keys = b.viewkeys() | c  # Union of keys.
result = [(k, max(b.get(k, ninf), c.get(k, ninf))) for k in sorted(all_keys)]
print(result)  # [(1, 1), (2, 0), (3, 0), (4, 4), (5, 5)]

答案 1 :(得分:1)

您可以在上面的代码段中添加一行(最后一行):

b = {1:0,2:0,3:0,4:0,5:0}
c = {1:1,4:4,5:5}

d={k:c[k] if k in c and c[k]>b[k] else v for k,v in b.items()}
print [(k, v) for k, v in d.items()] # [(1, 1), (2, 0), (3, 0), (4, 4), (5, 5)]

答案 2 :(得分:0)

你可以做同样的事情,但按照b的排序键的顺序,并动态制作一个元组

d=tuple( 
     (k  ,  (c[k] if k in c and c[k]>b[k] else b[k])  ) 
          for k in sorted(b.keys()) )

或某些人可能更喜欢

d=tuple( 
     (k  ,  max(b[k],c.get(k,minus_inf))  ) 
          for k in sorted(b.keys()) )

...如果存在合适的minus_inf,其小于所有可能的b [k]。对于数字,None有效,因此您可以使用

d=tuple( 
     (k  ,  max(b[k],c.get(k))  )   # note, max( x,None)==x  here 
                  for k in sorted(b.keys()) )