当两个列表组合成字典时,字典元素的大小减小

时间:2017-06-07 15:31:13

标签: python list dictionary

我有两个列表,我将它们的元素组合成一个字典。两个列表的大小都是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)。

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),......]的格式打印出来,而不是它原来的样子,但是应该完成我认为你最初的意图。