【问题标题】:Keep some keys in my list with comprehension?在我的列表中保留一些键以理解?
【发布时间】:2014-03-04 03:01:11
【问题描述】:

我有一个从 .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。

【问题讨论】:

  • CSV_LIST 的所有项目似乎都不是两个项目列表/元组。你能打印一点CSV_LIST 并在这里发布输出吗?
  • 我最终使用 csvcut csvkit.readthedocs.org/en/latest/scripts/csvcut.html#examples 来获得我需要的东西,但这并不是一个完美的解决方案。
  • @Amanda:未来的提示——虽然添加版本标签很有用,但您还应该添加通用的python 标签。您会注意到,在我编辑标签后,几分钟内就会发布答案;不是每个人都订阅特定于版本的标签。 [其中一些只是时区效应,但我以前见过这种情况很多次。]

标签: python python-2.7


【解决方案1】:

您的字典理解很好,但是由于您有一个列表 字典,因此您必须使用该字典理解为各个列表项创建一个列表理解。另外,既然你想保留这些列,我想你应该放弃那个not。试试这个:

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

【讨论】:

  • 轰隆隆。谢谢你。我最终会注意到“NOT”问题。字典列表,不多。
【解决方案2】:

另一种方法是使用

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

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

【讨论】:

    【解决方案3】:

    问题在于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'])
    

    【讨论】:

    • 有道理,尽管这似乎也应该起作用:CSV_OBJ = csv.DictReader(open(CSV_PATH, 'r'), KEEP_COLS) -- 它确实接近了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多