【问题标题】:How to create a list of dictionaries from a csv file without list comprehension如何在没有列表理解的情况下从 csv 文件创建字典列表
【发布时间】:2019-07-09 06:10:10
【问题描述】:

输出必须是这样的:

[{'id': '1', 'first_name': 'Heidie','gender': 'Female'}, {'id': '2', 'first_name': 'Adaline', 'gender': 'Female'}, {...}

有一个代码 sn-p 可以运行,运行这个需求。

with open('./test.csv', 'r') as file_read:
   reader = csv.DictReader(file_read, skipinitialspace=True)
   listDict = [{k: v for k, v in row.items()} for row in reader]
   print(listDict)

但是,我无法理解上面这段代码的一些要点:

  1. 列表理解:listDict = [{k: v for k, v in row.items()} for row in reader]
    • python 如何解释这个?
    • 编译器如何组装一个总是带有标题(idfirst_namegender)及其值的列表?
    • 如何使用嵌套的for 实现此代码

我看了这些答案,但我还是不明白:

我的 csv 文件:

id,first_name,last_name,email,gender
1,Heidie,Philimore,hphilimore0@msu.edu,Female
2,Adaline,Wapplington,awapplington1@icq.com,Female
3,Erin,Copland,ecopland2@google.co.uk,Female
4,Way,Buckthought,wbuckthought3@usa.gov,Male
5,Adan,McComiskey,amccomiskey4@theatlantic.com,Male
6,Kilian,Creane,kcreane5@hud.gov,Male
7,Mandy,McManamon,mmcmanamon6@omniture.com,Female
8,Cherish,Futcher,cfutcher7@accuweather.com,Female
9,Dave,Tosney,dtosney8@businesswire.com,Male
10,Torr,Kiebes,tkiebes9@dyndns.org,Male

【问题讨论】:

  • 您可以发布您的test.csv 的样本吗?
  • @user5173426 完成!
  • 在这种情况下,理解是一种浪费。不需要字典理解,因为每一行都已经是字典。因此,列表理解也是如此,因为不需要对元素进行进一步的操作。一个简单的ˋlistDict = list(reader)ˋ就足够了。

标签: python csv dictionary for-loop list-comprehension


【解决方案1】:

你的列表理解:

listDict = [{k: v for k, v in row.items()} for row in reader]

等于:

item_list = []

#go through every row
for row in reader:
    item_dict = {}
    #in every row go through each item
    for k,v in row.items():
        #add each items k,v to dict.
        item_dict[k] = v
    #append every item_dict to item_list
    item_list.append(item_dict)

print(item_list)

编辑(更多解释):

#lets create a list
list_ = [x ** 2 for x in range(0,10)]
print(list_)

返回:

[0,1,4,9,16,25,36,49,64,81]

你可以这样写:

 list_ = []
 for x in range(0,10):
     list_.append(x ** 2)

所以在那个例子中,是的,你是“向后”阅读的

现在假设下一个:

#lets create a list
list_ = [x ** 2 for x in range(0,10) if x % 2 == 0]
print(list_)

返回:

[0,4,16,36,64]

你可以这样写:

 list_ = []
 for x in range(0,10):
     if x % 2 == 0:
         list_.append(x ** 2)

所以这不是 100% 倒退,但发生的事情应该是合乎逻辑的。希望对您有所帮助!

【讨论】:

  • 我应该总是从头到尾阅读列表理解代码吗?除此之外,k 如何始终识别标头?
  • 编辑了帖子。希望它更清楚。一开始它是一个“奇怪”的语法,但是当你习惯它时,它会为你节省大量的打字时间,实际上变得更好阅读;)
  • 这个例子很棒!谢谢
猜你喜欢
  • 2021-02-19
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2015-05-22
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多