gpt4 book ai didi

python - 带有嵌套列表的字典理解,防止覆盖

转载 作者:行者123 更新时间:2023-11-30 23:10:14 25 4
gpt4 key购买 nike

我正在尝试使用嵌套列表来使用字典理解。只要 key 是唯一的,一切就可以正常工作。但是,如果存在多个键,我想将值附加到该键而不是覆盖该值。使用理解可以做到这一点吗?

seq1 = [[1, [1,2,3,4]], [2, [5,6,7]]]
seq2 = [[1, [1,2,3,4]], [1, [5,6,7]]]

print {key: [val] for key, val in seq1} # Or dict(seq1)
>>> {1: [[1, 2, 3, 4]], 2: [[5, 6, 7]]}

print {key: [val] for key, val in seq2}
>>> {1: [[5, 6, 7]]} # First value is overwritten

# Desired output:
def index_reads(reads):
result = {}
for i in reads:
d = dict([i])
for key, val in d.iteritems():
if key in result:
result[key].append(val)
else:
result[key] = [val]
return result

print index_reads(seq1)
>>> {1: [[1, 2, 3, 4]], 2: [[5, 6, 7]]}

print index_reads(seq2)
>>> {1: [[1, 2, 3, 4], [5, 6, 7]]}

抱歉,我找不到此问题的重复内容。

最佳答案

您不需要列表理解。作为一种更Pythonic的方式,你可以使用 dict.setdefault()方法:

>>> d={key: [val] for key, val in seq1}
>>> for key, val in seq2:
... d.setdefault(key,[]).append(val)
...
>>> d
{1: [[1, 2, 3, 4], [1, 2, 3, 4], [5, 6, 7]], 2: [[5, 6, 7]]}

您还可以使用collections.defaultdict来完成此类任务。

当您在 seq2 中使用不同的键时,它也会显示出它的强大功能,例如:

>>> seq2 = [[1, [1,2,3,4]], [5, [5,6,7]]]
>>> d={key: [val] for key, val in seq1}
>>> for key, val in seq2:
... d.setdefault(key,[]).append(val)
...
>>> d
{1: [[1, 2, 3, 4], [1, 2, 3, 4]], 2: [[5, 6, 7]], 5: [[5, 6, 7]]}

如果您不想保留重复项,可以使用 defaultdictset 作为容器:

>>> from collections import defaultdict
>>> seq1 = [[1, [1,2,3,4]], [2, [5,6,7]]]
>>> seq2 = [[1, [1,2,3,4]], [1, [5,6,7]]]
>>>
>>> d=defaultdict(set)
>>> for key, val in seq1+seq2:
... d[key].add(tuple(val))
...
>>> d
defaultdict(<type 'set'>, {1: set([(5, 6, 7), (1, 2, 3, 4)]), 2: set([(5, 6, 7)])})

关于python - 带有嵌套列表的字典理解,防止覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30778696/

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