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

2024-04-25 06:11:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码,它将比较两个字典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)]

在Python2.7中似乎没有元组理解,除非我没有在正确的地方寻找答案。你知道吗

有人能帮忙吗?你知道吗


Tags: and代码inforif字典排序顺序
3条回答

为什么不能对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中键的子集。如果这不是真的,您需要获得键的并集,并比较每个dict的值:

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)]

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

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)]

你也可以做同样的事情,但是按照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()) )

。。。如果存在一个小于所有可能b[k]的合适的负inf。对于数字,None可以使用

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

相关问题 更多 >