为什么我的一些字典键和值消失了?

时间:2018-05-21 04:50:07

标签: python python-3.x list dictionary

这是我的代码:

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

2 个答案:

答案 0 :(得分:3)

Python不允许在词典中使用重复键。与你的例子类似:

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

如果它允许重复密钥,则无法知道是否为2返回390

如果您想跟踪元组的数量,可以使用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})]

或者,如果您只想将键与值相关联,则可以使用以下内容:

class update:
    def __init__(self):
        self.items = {}

    def add(self, number, value):
        if number in self.items: # if we've seen this key before
            self.items[number].append(value) # add it to the list
        else: # if we haven't, create a new list
            self.items[number] = [value]

    def __repr__(self):
        return str(self.items)


update_lists = []
for l in listy:
    u = update()
    for (k, v) in l:
        u.add(k, v)
    update_lists.append(u)

print(update_lists)

其中给出了以下输出:

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

答案 1 :(得分:0)

值似乎消失,因为您尝试使用重复键创建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)