我有两个列表,我将它们的元素组合成一个字典。两个列表的大小都是20,创建的字典几乎总是13-15。代码是:
nodes = []
for x in range(1,21):
nodes.append(str(random.randint(1,20)))
print(nodes)
输出:
['3', '6', '10', '12', '12', '10', '11', '17', '6', '19', '20', '19', '7', '16', '9', '13', '15', '9', '12', '5']
其余代码:
lines=[]
fp = open("work.txt") # open file on read mode
lines = fp.read().split("\n") # create a list containing all lines
fp.close() # close file
print(lines)
输出:
['5', '1', '7', '1', '1', '3', '12', '1', '1', '8', '7', '5', '12', '5', '5', '3', '7', '7', '13', '1', '']
制作字典:
dictionary = dict(zip(nodes,lines))
print(dictionary)
{'3': '1', '6': '5', '10': '12', '12': '13', '10': '12', '11': '7', '17': '7', '6': '5', '19': '3', '20': '1', '19': '1', '17': '3', '16': '5', '9': '7'}
如您所见,拉链时尺寸变小到14。你知道原因是什么,我该如何解决?
注意:我必须保留所有密钥。列表中的重复是有目的的。 注2:输出应具有上述格式,两个数字对。 (1,3)或(1:3)但不是(1:3,4)。
答案 0 :(得分:2)
对于节点,行字典,您需要唯一的键。从非唯一键创建一个dict会在某个时刻覆盖第一个。
如果确实想要非唯一索引,只需将数据存储在元组列表中。您将无法快速访问,但这将有效:
tuples = list(zip(nodes,lines))
现在,如果您想收集同一节点索引下的行,您可以使用例如defaultdict
创建行列表的字典:< / p>
import collections
d = collections.defaultdict(list)
for node,text in zip(nodes,lines):
d[node].append(text)
因此,对于每个唯一节点,您将获得相关行的列表。
答案 1 :(得分:1)
因为您在字典中不能有重复的键名
>>> nodes = ['3', '6', '10', '12', '12', '10', '11', '17', '6', '19', '20', '19', '7', '16', '9', '13', '15', '9', '12', '5']
>>> lines = ['5', '1', '7', '1', '1', '3', '12', '1', '1', '8', '7', '5', '12', '5', '5', '3', '7', '7', '13', '1', '']
>>> dictionary = dict(zip(nodes,lines))
>>> len(dictionary.keys())
14
节点中只有14个唯一的元素,这是你的字典键
>>> len(set(nodes))
14
答案 2 :(得分:1)
你的&#34;键&#34;列表有重复的项目。字典需要唯一的密钥,以前输入的密钥会被覆盖。
您可以按如下方式对列表中的项目进行分组
result = {}
for key, item in zip(x, y):
if key in result:
result[key].append(item)
else:
result[key] = [item]
答案 3 :(得分:0)
问题是你不希望字典以你想要一个元组列表开头。您的代码应该是:
nodes = []
for x in range(1,21):
nodes.append(str(random.randint(1,20)))
lines = []
fp = open("work.txt")
lines = fp.read().split("\n")
fp.close()
zipped = list(zip(nodes, lines))
这将为您提供一个元组列表,第一个是随机数,第二个是读取的数字,不会消除重复。它将以[(3,5),(6,1),......]的格式打印出来,而不是它原来的样子,但是应该完成我认为你最初的意图。