python3:cs中多个键的嵌套字典

2024-04-16 05:13:52 发布

您现在位置:Python中文网/ 问答频道 /正文

数据如下:

id,outer,inner1,inner2,inner3
123,"Smith,John",a,b,c
123,"Smith,John",d,e,f
123,"Smith,John",g,h,i
456,"Williams,Tim",xx,yy,zz
456,"Williams,Tim",vv,ww,uu
456,"Miller,Ray",rrr,sss,ttt
456,"Miller,Ray",qqq,www,ppp

我希望生成的词典

^{pr2}$

我尝试调整来自Python Creating A Nested Dictionary From CSV File的已接受答案,但此方法在每一行都覆盖字典,因此只有每个id的最后一行才会出现在字典中。在


Tags: 数据id字典johnsmithouterxxtim
3条回答

是的,因为在这个例子中,这一行每次都是UID:

new_data_dict[row["UID"]] = item

相反,您可以使用setdefault将条目默认设置为列表并附加:

^{pr2}$

dict.setdefault是获取数据结构并根据需要创建它们的好方法。在

import csv
import pprint

data = '''123,"Smith,John",a,b,c
123,"Smith,John",d,e,f
123,"Smith,John",g,h,i
456,"Williams,Tim",xx,yy,zz
456,"Williams,Tim",vv,ww,uu
456,"Miller,Ray",rrr,sss,ttt
456,"Miller,Ray",qqq,www,ppp
'''
data = data.splitlines()
data = csv.reader(data)

result = {}
for datum in data:
    outer = result.setdefault(datum[0], {})
    inner = outer.setdefault(datum[1], [])
    inner.extend(datum[2:])

pprint.pprint(result)

一个collections.defaultdict使用每行的第一个元素作为外部dict键,然后使用第二个元素作为内部dict键,并将行中的其余值添加到列表中作为内部dict键的值:

import csv
from collections import defaultdict
with open("in.txt" ) as f:
    next(f) # skip header
    d = defaultdict(lambda: defaultdict(list))
    r = csv.reader(f)
    for row in r:
        d[row[0]][row[1]].extend(row[2:])

from pprint import pprint as pp

pp(dict(d))

输出:

^{pr2}$

因为您使用的是python3,所以我们可以在循环中使用*进行解包,使代码更漂亮:

with open("in.txt") as f:
    next(f)  # skip header
    d = defaultdict(lambda: defaultdict(list))
    r = csv.reader(f)
    for k1, k2, *vals in r:
        d[k1][k2].extend(vals))

相关问题 更多 >