我有以下代码,它将比较两个词典b
和c
,并创建一个名为d
的第三个词典,其中包含比较b
到c
并取得最高分:
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()}
但是,由于字典未排序,我必须使用以下语法将b
和c
转换为元组,然后再进行比较,以便它们按正确顺序排列:
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中似乎没有可用的元组理解,除非我没有在正确的位置寻找答案。
有人可以帮忙吗?
答案 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()) )