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

2024-09-22 20:24:26 发布

您现在位置: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"]}

谢谢你


Tags: 元素字典情况d2elemv02v01v03
3条回答

我更喜欢与为其设计的内置数据类型sets做区别。你知道吗

写循环比详细理解更可取。一行程序很聪明,但可以返回并理解的可理解代码更好。你知道吗

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

根据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': []}

这将把dictd的一个副本放在一起,其中包含的列表将从max键中存储的所有项中剥离出来。最终的dict看起来或多或少像你想要的。 如果不希望在键v03处使用空列表,请将结果本身包装到另一个dict中:

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

编辑: 如果您的原始dict有一个非常大的键集[或者经常需要执行上述操作,],那么您可能还希望用一些先前分配的列表变量来替换表达式d.get(max(d.keys())),以获得性能[,但我不确定它是否确实没有得到预先计算。这会将整个过程的速度提高近100%。下面的表达式在我的机器上以1.5秒的时间运行100000次,而未替换的表达式需要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}
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\u value]中的值和其他每个键的值之间的集合差,您可以对集合操作更感兴趣,但首先,我认为您应该熟悉使用字典和列表。你知道吗

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

不使用集合的一个原因是解决方案没有足够的泛化,因为集合只能有可哈希对象。如果您的值是列表的列表,那么成员(子列表)是不可散列的,因此您不能使用set操作

相关问题 更多 >