将csv写为嵌套的dict并将值附加到list python

时间:2017-05-02 09:32:56

标签: python list csv dictionary updates

我有一个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'}]

1 个答案:

答案 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