我有一个csv文件,其中包含3人姓名,出生日期,年龄,性别,血液组,手机号码,电话号码等详细信息。我想将这些csv细节写入嵌套的dict中,当我在第20行打印d但是dict是无序的时(即)第一人的细节与其他人相比有不同的顺序。我想将它们打印为嵌套的dict,并将它们附加到空列表中,以便我可以通过迭代dict值来获取列表。
输入:
Name Age Date of birth Sex Blood Group Mobile number Phone number
A 1 01-01-95 M O +ve 9876543210 01234567
B 2 02-02-99 F B +ve 9898989898 07854123
C 3 03-03-93 F A +ve 9123456780 04693218
以下是我的代码:
import csv
d={}
ls=[]
def nest():
with open ("details.csv", 'r') as f:
reader=csv.DictReader(f)
for row in reader:
d.update(row)
d.update({'Contact Info': {'Mobile Number':d['Mobile Number'],'Phone Number':d['Phone Number']}})
d.update({'Personal Details': {'Sex':d['Sex'], 'Blood Group':d['Blood Group'], 'Age':d['Age']}})
map(d.pop, ['Mobile Number','Phone Number','Sex','Blood Group', 'Age'])
print d
ls.append(d)
print ls
nest()
输出:
[{'Name': 'A','Personal Details': {'Blood Group': 'O +ve', 'Age': '1', 'Sex': 'M'}, 'Contact Info': {'Phone Number': '01234567', 'Mobile Number': '9876543210'}, 'Date of Birth': '01-01-95'}
{'Name': 'B','Personal Details': {'Blood Group': 'B +ve', 'Age': '2', 'Sex': 'F'}, 'Contact Info': {'Phone Number': '07854123', 'Mobile Number': '9898989898'}, 'Date of Birth': '02-02-99'}
{'Name': 'C','Personal Details': {'Blood Group': 'A +ve', 'Age': '3', 'Sex': 'F'}, 'Contact Info': {'Phone Number': '04693218', 'Mobile Number': '9123456780'}, 'Date of Birth': '03-03-93'}]
答案 0 :(得分:1)
我认为你的更新逻辑有点扭曲,因为你总是更新同一个字典,你实际上覆盖了你追加到ls
的先前值。
因此,如果您希望保持代码不变(我不推荐),您需要在附加dict之前复制该dict。 ls.append(deepcopy(d))
Dicts是可变类型,你总是在列表中添加相同的引用,因此所有元素都具有相同的值(最后一行)。
由于您希望订购密钥,只需使用和OrderedDict
即可我只是为了高尔夫而在一条线上做到了,但它大致是我如何去做的:
def nest(reader):
return [
OrderedDict(
[
('Name', row['Name']),
('Personal Details', OrderDicted((k, row[k]) for k in ('Sex', 'Blood Group', 'Age'))),
('Contact Info', OrderedDict((k, row[k]) for k in ('Mobile Number', 'Phone Number'))),
('Date of Birth', row[k])
]
) for row in reader
]
编辑此外,如果您使用的是python 3.6并且您的密钥是有序的,那么这只是新实现的副作用,不应该依赖它,请参阅此discussion