关于python:通过理解保留我的列表中的一些键?

Keep some keys in my list with comprehension?

我有一个从.csv中提取的大列表:

1
2
3
CSV_PATH = 'myfile.csv'
CSV_OBJ = csv.DictReader(open(CSV_PATH, 'r'))
CSV_LIST = list(CSV_OBJ)

我只想保留其中的一些列:

1
KEEP_COLS = ['Name', 'Year', 'Total Allocations', 'Enrollment']'

从安全地从字典中删除多个键来看,这应该是可行的:

1
BETTER = {k: v for k, v in CSV_LIST if k not in KEEP_COLS}

但我得到了一个错误:ValueError: too many values to unpack我在这里遗漏了什么?我可以写一个循环,通过csv列表运行,通过只保留我想要的内容来产生更好的结果,但是我怀疑使用理解更像是一种Python。

根据要求,一块csv列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{'EIN': '77-0000091',
  'FR': '28.4',
  'Name': 'Org A',
  'Enrollment': '506',
  'Total Allocations': '$34214',
  'geo_latitude': '37.9381775755',
  'geo_longitude': '-122.3146910612',
  'Year': '2009'},
 {'EIN': '77-0000091',
  'FR': '28.4',
  'Name': 'Org A',
  'Enrollment': '506',
  'Total Allocations': '$34214',
  'geo_latitude': '37.9381775755',
  'geo_longitude': '-122.3146910612',
  'Year': '2010'}

在司令部,我可以做csvcut -c 'Name','Year','Total Allocations','Enrollment' myfile.csv > better_myfile.csv,但那绝对不是Python。


另一种选择是使用

1
CSV_LIST = map(operator.itemgetter(*KEEP_LIST), CSV_OBJ)

这将创建具有所需列的元组列表。


您的字典理解能力很好,但是由于您有一个字典列表,所以必须使用该字典对单个列表项的理解创建一个列表理解。另外,由于您想保留这些列,我想您应该删除该not。试试这个:

1
[{k: v for k, v in d.items() if k in KEEP_COLS} for d in CSV_LIST]


问题是,CSV_LIST是一个列表,而不是单个dict。@托比亚斯解释了如何正确地打开它。

但是,如果你担心自己是个Python,为什么要把一个DictReader处理成一个字典列表,然后过滤掉除了几个键以外的所有键?不知道您的用例,我无法确定,但按预期的方式逐行使用DictReader可能会更干净、更简单:

1
2
3
with open(CSV_PATH, 'r') as f:
    for row in csv.DictReader(f):
        process(row['Name'],row['Year'],row['Total Allocations'],row['Enrollment'])