d = {'v03':["elem_A","elem_B","elem_C"],'v02':["elem_A","elem_D","elem_C"],'v01':["elem_A","elem_E"]}
last = None
d2 = {}
for key in sorted(d.keys()):
if last:
if set(d[last]) - set(d[key]):
d2[last] = sorted(set(d[last]) - set(d[key]))
last = key
print d2
{'v01': ['elem_E'], 'v02': ['elem_D']}
from collections import defaultdict
myNewDict = defaultdict(list)
all_keys = d.keys()
all_keys.sort()
max_value = all_keys[-1]
for key in d:
if key != max_value:
for value in d[key]:
if value not in d[max_value]:
myNewDict[key].append(value)
我更喜欢与为其设计的内置数据类型sets做区别。你知道吗
写循环比详细理解更可取。一行程序很聪明,但可以返回并理解的可理解代码更好。你知道吗
根据python版本的不同,您可能只需要使用dict comprehension一行就可以完成这项工作:
这将把dict
d
的一个副本放在一起,其中包含的列表将从max键中存储的所有项中剥离出来。最终的dict看起来或多或少像你想要的。 如果不希望在键v03
处使用空列表,请将结果本身包装到另一个dict中:编辑: 如果您的原始dict有一个非常大的键集[或者经常需要执行上述操作,],那么您可能还希望用一些先前分配的列表变量来替换表达式
d.get(max(d.keys()))
,以获得性能[,但我不确定它是否确实没有得到预先计算。这会将整个过程的速度提高近100%。下面的表达式在我的机器上以1.5秒的时间运行100000次,而未替换的表达式需要3秒以上。你知道吗通过取d[max\u value]中的值和其他每个键的值之间的集合差,您可以对集合操作更感兴趣,但首先,我认为您应该熟悉使用字典和列表。你知道吗
不使用集合的一个原因是解决方案没有足够的泛化,因为集合只能有可哈希对象。如果您的值是列表的列表,那么成员(子列表)是不可散列的,因此您不能使用set操作
相关问题 更多 >
编程相关推荐