python-3.x 为什么我的一些字典键和值消失了?

5hcedyr0  于 2023-02-01  发布在  Python
关注(0)|答案(2)|浏览(208)

这是我的代码:

listy = [[(100, 1), (90, 2), (90, 2), (80, 3), (70, 4)], [(100, 1), (90, 2), (90, 2), (80, 3), (80, 3)]]
track = [dict(x) for x in listy] 
print(track)

我有一个嵌套的元组列表,我把它们转换成一个列表中的字典,但是问题是一些键和值在元组被修改后消失了,输出如下:

[{100: 1, 90: 2, 80: 3, 70: 4}, {100: 1, 90: 2, 80: 3}]

相反,输出应该是这样的:

[{100:1, 90:2, 90:2, 80:3, 70:4},{100:1, 90:2, 90:2, 80:3, 80:3}]

为什么我的代码会给出错误的输出,可能的解决方案是什么?我使用的是Python 3.x

tcomlyy6

tcomlyy61#

Python不允许字典中有重复的键,类似于你的例子:

>>> d={100:1, 90:2, 90:3, 80:3, 70:4}
>>> d[90]
3

如果它允许重复的键,它就无法知道是返回2还是90
如果你想跟踪元组的数量,你可以使用collections.Counter

from collections import Counter
listy = [[(100, 1), (90, 2), (90, 2), (80, 3), (70, 4)], [(100, 1), (90, 2), (90, 2), (80, 3), (80, 3)]]
count = [Counter(x) for x in listy]
print(count)

其输出为:
[Counter({(90, 2): 2, (100, 1): 1, (80, 3): 1, (70, 4): 1}), Counter({(90, 2): 2, (80, 3): 2, (100, 1): 1})]
或者,如果您只想将键与值关联起来,则可以使用defaultdict

from collections import defaultdict

listy = [
    [(100, 1), (90, 2), (90, 2), (80, 3), (70, 4)],
    [(100, 1), (90, 2), (90, 2), (80, 3), (80, 3)],
]

update_lists = []
for l in listy:
    # if a key is not found, automatically create a list
    u = defaultdict(list)
    for (k, v) in l:
        u[k].append(v)
    update_lists.append(u)

print(update_lists)

它提供以下输出:
[defaultdict(<class 'list'>, {100: [1], 90: [2, 2], 80: [3], 70: [4]}), defaultdict(<class 'list'>, {100: [1], 90: [2, 2], 80: [3, 3]})]

3mpgtkmj

3mpgtkmj2#

值似乎消失了,因为您尝试创建具有重复键的dict:

data = [(1, 'one'), (1, 'two'), (2, 'three')]
dictionary = dict(data)

将导致:

{1: 'one', 2: 'three'}

Python字典不支持重复键。
@Mahir您可以将多个值关联到字典中的一个键,如下所示

multi_value_dict = {}
multi_value_dict.setdefault(key, []).append(value)

相关问题