gpt4 book ai didi

python - 使用字典理解反转一对多映射

转载 作者:行者123 更新时间:2023-12-04 07:13:15 26 4
gpt4 key购买 nike

lst = [{'272': '4', '273': '4', '274': '4', '275': '5'}]
dct = {}

for k, v in lst[0].items():
if dct.get(v) is None:
dct.update({v: [k]})
else:
dct[v].append(k)
输出:
{'4': ['272', '273', '274'], '5': ['275']}
我也可以写一个嵌套的理解:
dct = {v: [k for (k, v1) in lst[0].items() if v1 == v]
for (k, v) in lst[0].items()}
输出是一样的:
{'4': ['272', '273', '274'], '5': ['275']}** 
但是我们可以尝试通过使用单个 for 来获得相同的结果吗?在字典理解中循环?

最佳答案

你不能在一个 dict 理解中一步完成同样的事情。您有效地反转了字典,但由于原始字典中没有 1 对 1 映射,因此您需要为每个值聚合重复的键。
问题中的列表是一条红鲱鱼。我要使用

d = {'272': '4', '273': '4', '274': '4', '275': '5'}
您可以采取几种方法。明智的做法是保持循环,但稍微简化一下。例如,您可以使用 collections.defaultdict ,这就像一个普通的 dict ,除了它允许您使用空值自动设置缺少的键:
from collections import defaultdict

result = defaultdict(list)
for k, v in d.items():
result[v].append(k)
如果您使用几个标准库函数,您可以为此编写一个理解。一种方法是使用 itertools.groupby ,但这需要您申请 sorted 第一的:
from itertools import groupby
from operator import itemgetter

result = {k: list(map(itemgetter(0), vs))
for k, vs in groupby(sorted(d.items(),
key=itemgetter(1, 0)),
itemgetter(1))}
operator.itemgetter lambda x: x[0]大约在这里,但更快,更有效。
使用第二种解决方案,请注意,由于排序的原因,时间复杂度从 O(n) 变为 O(n log n),并且为了拥有“单行”而牺牲了很多易读性。

关于python - 使用字典理解反转一对多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68939549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com