如何用多个列表创建Python字典'通过从.txt文件中读取每个键?

时间:2016-10-01 14:08:23

标签: python dictionary

我有一个大文本文件,如下所示:

1   27  21  22
1   151 24  26
1   48  24  31
2   14  6   8
2   98  13  16
.
.
.

我想创建一个字典。每个列表的第一个数字应该是字典中的键,并且应该采用以下格式:

{1: [(27,21,22),(151,24,26),(48,24,31)],
 2: [(14,6,8),(98,13,16)]}

我有以下代码(总点数是文本文件第一列中的最大数字(即字典中最大的键)):

from collections import defaultdict

info = defaultdict(list)
filetxt = 'file.txt'
i = 1

with open(filetxt, 'r') as file:
    for i in range(1, num_cities + 1):
        info[i] = 0
    for line in file:
        splitLine = line.split()
        if info[int(splitLine[0])] == 0:
            info[int(splitLine[0])] = ([",".join(splitLine[1:])])
        else:
            info[int(splitLine[0])].append((",".join(splitLine[1:])))

输出

{1: ['27,21,22','151,24,26','48,24,31'],
 2: ['14,6,8','98,13,16']}

我想要这个字典的原因是因为我想在每个"内部列表中运行for循环"给定密钥的字典:

for first, second, third, in dictionary:
   ....

我不能用我当前的代码执行此操作,因为字典的格式略有不同(它在上面的for循环中需要3个值,但接收的值超过3个),但它可以使用第一个字典格式。

任何人都可以建议解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

result = {}
with open(filetxt, 'r') as f:
    for line in f:
        # split the read line based on whitespace
        idx, c1, c2, c3 = line.split()

        # setdefault will set default value, if the key doesn't exist and
        # return the value corresponding to the key. In this case, it returns a list and
        # you append all the three values as a tuple to it
        result.setdefault(idx, []).append((int(c1), int(c2), int(c3)))

编辑:由于你希望密钥也是一个整数,你可以map int函数超过分割值,就像这样

        idx, c1, c2, c3 = map(int, line.split())
        result.setdefault(idx, []).append((c1, c2, c3))

答案 1 :(得分:3)

您正在将您的值转换回逗号分隔的字符串,这些字符串在for first, second, third in data中无法使用 - 所以只需将它们保留为列表splitLine[1:](或转换为tuple)。
您不需要使用for初始化defaultdict循环。您也不需要使用defaultdict进行条件检查。

您的代码没有多余的代码:

with open(filetxt, 'r') as file:
    for line in file:
       splitLine = line.split()
       info[int(splitLine[0])].append(splitLine[1:])

稍微不同的是,如果你想在int上操作,我会在前面进行转换:

with open(filetxt, 'r') as file:
    for line in file:
       splitLine = list(map(int, line.split()))   # list wrapper for Py3
       info[splitLine[0]].append(splitLine[1:])

实际上在Py3中,我会这样做:

       idx, *cs = map(int, line.split())
       info[idx].append(cs)