从字典中的值返回唯一元素

时间:2014-02-20 00:41:38

标签: python

我有这样的字典:

d = {'v03':["elem_A","elem_B","elem_C"],'v02':["elem_A","elem_D","elem_C"],'v01':["elem_A","elem_E"]}

如何使用未包含在最高值键中的元素返回一个新词典? 在这种情况下:

d2 = {'v02':['elem_D'],'v01':["elem_E"]}

谢谢,

3 个答案:

答案 0 :(得分:1)

我更喜欢与为其设计的内置数据类型有所不同:集合。

最好是编写循环而不是精心理解。单行是聪明的,但可以理解的代码,你可以回归和理解更好。

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']}

答案 1 :(得分:0)

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)

通过设置d [max_value]和其他每个键之间的设置差异,你可以通过设置操作变得更加精彩,但首先我认为你应该习惯使用词典和列表。

defaultdict(<type 'list'>, {'v01': ['elem_E'], 'v02': ['elem_D']})

不使用集合的一个原因是解决方案没有足够概括,因为集合只能具有可散列对象。如果您的值是列表列表,则成员(子列表)不可清除,因此您无法使用set操作

答案 2 :(得分:0)

根据您的python版本,您可以使用dict comprehension仅使用一行完成此操作:

>>> d2 = {k:[v for v in values if not v in d.get(max(d.keys()))] for k, values in d.items()}
>>> d2
{'v01': ['elem_E'], 'v02': ['elem_D'], 'v03': []}

这将dict d的副本放在一起,其中包含的列表将被删除存储在max key中的所有项目。由此产生的dict看起来或多或少与您的目标一致。 如果您不想在键v03处使用空列表,请将结果本身包装在另一个词典中:

>>> {k:v for k,v in d2.items() if len(v) > 0}
{'v01': ['elem_E'], 'v02': ['elem_D']}

修改 的 如果您的原始字典具有非常大的密钥集[或经常需要所述操作],您可能还希望用一些先前分配的列表变量替换表达式d.get(max(d.keys()))以获得性能[ 但我不确定它是否实际上无法预先计算 ]。 这使得整体的速度提高了近100%。以下在我的机器上以1.5秒的速度运行100,000次,而未取代的表达式则需要3秒以上。

>>> bl = d.get(max(d.keys()))
>>> d2 = {k:v for k,v in {k:[v for v in values if not v in bl] for k, values in d.items()}.items() if len(v) > 0}