将 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 并且您的密钥已订购,这只是不应依赖的新实现的副作用,请参阅这个
我有一个 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 并且您的密钥已订购,这只是不应依赖的新实现的副作用,请参阅这个