两个列表生成包含多个值的字典键

3
有没有可能从两个具有相同键的列表中创建字典,而不必遍历整个数据集?不需要进行遍历整个数据集。
最小示例:
keys = [1, 2, 3, 2, 3, 4, 5, 1]
values = [1, 2, 3, 4, 5, 6, 7, 8]

# hoped for result:
dictionary = dict(???)
dictionary = {1 : [1,8], 2:[2,4], 3:[3,5], 4:[6], 5:[7]}

当使用 zip 时,键-值对将被覆盖并插入:
dictionary = dict(zip(keys,values))
dictionary = {1: 8, 2: 4, 3: 5, 4: 6, 5: 7}

我也很乐意使用 Multidict。


2
请参阅文档中的第一个defaultdict示例 https://docs.python.org/3/library/collections.html#defaultdict-examples - wim
抱歉,我的意思是不需要显式地迭代数据集。我真的很喜欢zip方法,因为它非常简单。 - LeoE
将列表压缩成对,使用group函数对结果进行分组,然后从分组序列构建字典。 - Prune
@RomanPerekhrest 这不是一个我需要它的问题,而更多的是一个如果有人知道如何做到这一点的问题。我认为我们都在这里学习新事物,今天我发现没有一种简单、快速和可读的方式来编写这段代码。对我来说,这也是一个结果,我学到了一些东西。 - LeoE
@LeoE,“没有简单,快速和可读性(!)的方法” - 这是错误的结论。你已经被建议使用defaultdict。此外,在Python中,循环并不等于“难以阅读的代码”。 - RomanPerekhrest
显示剩余3条评论
3个回答

4
这是一种不需要使用两个for循环的方法。
h = defaultdict(list)
for k, v in zip(keys, values):
    h[k].append(v)

print(h)
# defaultdict(<class 'list'>, {1: [1, 8], 2: [2, 4], 3: [3, 5], 4: [6], 5: [7]})

print(dict(h))
# {1: [1, 8], 2: [2, 4], 3: [3, 5], 4: [6], 5: [7]}



0

这是我能做的唯一一行代码。

dictionary = {k: [values[i] for i in [j for j, x in enumerate(keys) if x == k]] for k in set(keys)}

这远非易读的代码。请记住,清晰的代码总是比伪聪明的代码更好;)


-1

这里有一个我认为在逻辑上很容易理解的例子。不幸的是,它并没有使用像您希望的zip,也无法避免迭代,因为这样的任务必须以某种形式涉及迭代。

# Your data
keys = [1, 2, 3, 2, 3, 4, 5, 1]
values = [1, 2, 3, 4, 5, 6, 7, 8]

# Make result dict
result = {}
for x in range(1, max(keys)+1):
    result[x] = []

# Populate result dict
for index, num in enumerate(keys):
    result[num].append(values[index])

# Print result
print(result)

如果你知道keys数组的值范围,你可以通过提供带有整数键和空列表值的字面量results字典来加快这个过程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接