这是我的代码:
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
答案 0 :(得分:3)
Python不允许在词典中使用重复键。与你的例子类似:
>>> d={100:1, 90:2, 90:3, 80:3, 70:4}
>>> d[90]
3
如果它允许重复密钥,则无法知道是否为2
返回3
或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})]
或者,如果您只想将键与值相关联,则可以使用以下内容:
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)