将两个列表压缩为字典时出现问题吗?

时间:2018-10-25 08:48:33

标签: python python-3.x list data-structures

我有以下列表:

a = ['A', 'B', 'C', 'C']

b = ['2', '3', 2, 3]

为了获得一个命令,我将它们压缩如下:

a_dict = dict(zip(a,b))

但是,由于最终对象是字典,所以我不能重复输入键:

{'A': '2', 'B': '3', 'C': 3}

我可以使用哪些替代方法来获得类似的东西? (*):

{'A': '2', 'B': '3', 'C':2, 'C': 3}

我试图将所有内容都转换为元组,但是我正在使用pop替换字典中的某些键和值:

data['A'] = data.pop('B')

因此,我不能使用元组格式。因此,鉴于以上两个列表,我如何获得(*)?

3 个答案:

答案 0 :(得分:4)

在解决键冲突的同时,仍然保留字典快速索引的大部分好处的最常见方法是将值转换为列表:

d = {}
for k, v in zip(a, b):
    d.setdefault(k, []).append(v)

使d变为:

{'A': ['2'], 'B': ['3'], 'C': [2, 3]}

答案 1 :(得分:2)

使用dict无法获得所需的输出。您可以使用@blhsing的答案来解决名称冲突,也可以使用集来稍微接近所需的结果,因为我怀疑您想检查数据结构中已经存在的组合,因为您尝试使用元组。

SecretKey

因此c = set(zip(a, b)) 变为:

c

答案 2 :(得分:1)

defaultdict中的collections

from collections import defaultdict
d=defaultdict(list)
for k,v in zip(a,b):
   d[k].append(v)

现在:

print(dict(d))

输出:

{'A': ['2'], 'B': ['3'], 'C': [2, 3]}

如果关心单个元素列表:

print({k:(v if len(v)-1 else v[0]) for k,v in d.items()})

输出:

{'A': '2', 'B': '3', 'C': [2, 3]}