dict1 = {1 :["in",1], 2 :["out",1], 3 :["in",1]}
dict2 = {1 :["out",2], 2 :["out",1]}
vals = []
for k, v in dict1.iteritems():
if k in dict2:
if dict2[k][1] > v[1]:
vals.append((k, dict2[k]))
else:
vals.append((k,v))
else:
vals.append((k,v))
new_d = {}
new_d.update(dict2)
for k,v in vals:
new_d[k] = v
print(new_d)
{1: ['out', 2], 2: ['out', 1], 3: ['in', 1]}
你也可以复制和删除:
cp_d1 = dict1.copy()
cp_d2 = dict2.copy()
for k, v in dict1.iteritems():
if k in dict2:
if dict2[k][1] > v[1]:
del cp_d1[k]
else:
del cp_d2[k]
cp_d1.update(cp_d2)
print(cp_d1)
{1: ['out', 2], 2: ['out', 1], 3: ['in', 1]}
一些时间显示复制是最有效的,而使用
groupby
是最不有效的:
In [9]: %%timeit
...: vals = []
...: cp_d1 = dict1.copy()
...: cp_d2 = dict2.copy()
...: for k, v in dict1.iteritems():
...: if k in dict2:
...: if dict2[k][1] > v[1]:
...: del cp_d1[k]
...: else:
...: del cp_d2[k]
...: cp_d1.update(cp_d2)
...:
1000000 loops, best of 3: 1.61 µs per loop
In [20]: %%timeit
....: vals = []
....: for k, v in dict1.iteritems():
....: if k in dict2:
....: if dict2[k][1] > v[1]:
....: vals.append((k, dict2[k]))
....: else:
....: vals.append((k,v))
....: else:
....: vals.append((k,v))
....: new_d = {}
....: new_d.update(dict2)
....: for k,v in vals:
....: new_d[k] = v
....:
100000 loops, best of 3: 2.11 µs per loop
In [10]: %%timeit
{k: max(dict1.get(k), dict2.get(k), key=lambda x: x[1] if x else None)
for k in dict1.viewkeys() | dict2.viewkeys()}
....:
100000 loops, best of 3: 3.71 µs per loop
In [22]: %%timeit
....: l=dict2.items() +dict1.items()
....: g=[list(g) for k,g in groupby(sorted(l),lambda x : x[0])]
....: dict([max(t,key=lambda x: x[1][1]) for t in g])
....:
100000 loops, best of 3: 10.1 µs per loop
In [61]: %%timeit
....: conflictKeys = set(dict1) & set(dict2)
....: solvedConflicts = { key: dict1[key]
....: if dict1[key][1] > dict2[key][1]
....: else dict2[key]
....: for key in conflictKeys }
....: result = dict1.copy()
....: result.update(dict2)
....: result.update(solvedConflicts)
....:
100000 loops, best of 3: 2.34 µs per loop
[1,"in"]
而不是["in",1]
(假设您只有2个值或多个值按重要性顺序排序),则这将像Counter(dict1) | Counter(dict2)
一样简单,即多集的并集。 - jamylak