来自文件的Python-Dictionary,包含两个键和多个值

时间:2015-02-25 00:33:03

标签: python dictionary

(这个问题已在stackoverflow上的几篇帖子中得到解答。但是,我无法得到正确的结果,我无法弄清楚我做错了什么?)

我想从包含两个键和14个值的文本文件创建一个字典:

data.txt:

Key1    Key2    Val1    Val2    Val3…Val14
100       a     x0      y0      z0………n0
101       a     x1      y1      z1………n1
102       b     x2      y2      z2………n2
103       b     x3      y3      z3………n3
104       c     x4      y4      z4………n4
105       c     x5      y5      z5………n5
…
140       m     xm      ym      zm………nm

字典应如下所示:

{100: {a: [x0, y0, z0,…n0]},
101: {a: [x1, y1, z1,…n1]},
102: {b: [x2, y2, z2,…n2]},
103: {b: [x3, y3, z3,…n3]},
 …
140: {m: [xm, ym, zm,…nm]}}

我尝试过Code1和Code2。 Code1给出了一个非常大的字典,其中重复行,并附加其他行。 Code2给出错误TypeError:unhashable type:' slice'。

Code1:
lookupfile = open("data.txt", 'r')
lines = lookupfile.readlines()
lookup = lines[1:]   # Start the dictionary from row 1, exclude the column names
d={}
for line in lookup:
    dic = line.split()
    d.update({dic[0]: {dic[1]: dic[2:]}})
    print(d) 

Code2:
data = defaultdict(dict)
with open('data.txt', 'r') as file:
    reader = csv.DictReader(file)
    for row in reader:
        data[row['Key1']][row['Key2']]=row['Val1':]
        print (data)

我希望代码看起来像Code2,所以我以后可以使用列名。 但是,我将不胜感激任何帮助。

如果需要,我可以提供其他信息。

2 个答案:

答案 0 :(得分:4)

s="""Key1    Key2    Val1    Val2    Val3…Val14
100       a     x0      y0      z0
101       a     x1      y1      z1
102       b     x2      y2      z2
103       b     x3      y3      z3
104       c     x4      y4      z4
105       c     x5      y5      z5"""
d  = {}
for line in s.splitlines()[1:]:
    spl = line.split()
    d[spl[0]] ={spl[1]:spl[2:]}

from pprint import pprint
pprint(d)
{'100': {'a': ['x0', 'y0', 'z0']},
 '101': {'a': ['x1', 'y1', 'z1']},
 '102': {'b': ['x2', 'y2', 'z2']},
 '103': {'b': ['x3', 'y3', 'z3']},
 '104': {'c': ['x4', 'y4', 'z4']},
 '105': {'c': ['x5', 'y5', 'z5']}}

同样的逻辑适用于您的文件代码,以跳过文件对象上的第一行调用next。然后简单地将每行编入索引。

d = {}
with open('data.txt', 'r') as f:
    next(f) # skip header
    for row in f:
        spl = line.split()
        # slicing using spl[2:] will give you a list of all remaining values
        d[spl[0]] = {spl[1]:spl[2:]}

如果使用str.split在列之间实际上有多个空格,则比使用csv模块效果更好。

答案 1 :(得分:1)

您使用的是DictReader,因此每个row都是dict,您无法对dict进行切片(正如您尝试的那样)任务的RHS)。

因此请使用普通csv.reader(因此每个row都是list,您可以切片)并且:

data[row[0]][row[1]]=row[2:]