理解中保留我的列表中的一些键?

时间:2014-03-04 03:01:12

标签: python python-2.7

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

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

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

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

似乎Removing multiple keys from a dictionary safely似乎应该有效:

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

但是我收到了一个错误:ValueError: too many values to unpack我在这里错过了什么?我可以编写一个循环,通过CSV_LIST运行并通过保持我想要的东西产生更好,但我怀疑使用理解更加pythonic。

根据要求,提供一大块CSV_LIST

{'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,但这绝对不是pythonic。

3 个答案:

答案 0 :(得分:2)

你的字典理解很好,但由于你有一个列表的词典,你必须使用字典理解为各个列表项创建一个列表理解。此外,由于您希望保留这些列,我猜您应该放弃not。试试这个:

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

答案 1 :(得分:2)

另一种方法是使用

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

这将创建一个包含所需列的元组列表。

答案 2 :(得分:1)

问题在于CSV_LIST列表,而不是单个dict@tobias explained how to unpack it correctly.


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

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