将 csv 写为嵌套字典并将值附加到列表 python

write csv as nested dict and append the values to list python

我有一个 csv 文件,其中包含 3 个人姓名、出生日期、年龄、sex.blood 群组、手机号码、phone 号码的详细信息。我想将这些 csv 详细信息写入一个嵌套字典,当我在第 20 行打印 d 但该字典是无序的(即)与其他人相比,第一人称的详细信息顺序不同。我想将它们打印为嵌套字典,并将它们附加到一个空列表中,以便我可以通过迭代字典值来获取列表。

输入:

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'}]

我认为你的更新逻辑有点扭曲,因为你总是在更新同一个字典,你实际上是在覆盖你附加到 ls 的先前值。

因此,如果您想保持代码不变(我不推荐),您需要在附加之前复制字典。 ls.append(deepcopy(d)) 字典是可变类型,您总是将相同的引用附加到列表中,因此所有元素都将具有相同的值(最后一行)。

既然你想对钥匙进行排序,就用and 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
    ]

Edit 此外,如果您使用的是 python 3.6 并且您的密钥已订购,这只是不应依赖的新实现的副作用,请参阅这个