【问题标题】:List comprehension of namedtuples results in empty list对命名元组的列表理解导致空列表
【发布时间】:2017-04-19 08:39:22
【问题描述】:

我偶然发现了一个我似乎无法找到答案的问题。我正在使用 csv.DictReader 读取 csv 文件的内容,并根据该信息构造一个命名元组列表。但是,在运行它时,最终结果是一个空列表。

from collections import namedtuple
import csv

nt = namedtuple('suminfo', 'a, b, c')
checklist = ['check1', 'check2', 'check3']

with open('test.csv', 'r') as csv_file:
     csv_rows = csv.DictReader(csv_file, delimiter='\t')
     tups = [nt(row['first'], row['second'], row['third']) 
            for row in csv_rows if row['first'] in checklist]

我还尝试了一个典型的正常循环行,然后是一个命名元组的列表附加,这似乎工作得很好。

为什么列表理解没有按预期运行?感谢您的宝贵时间。

【问题讨论】:

    标签: python python-3.x csv list-comprehension namedtuple


    【解决方案1】:

    列表理解对我有用。我使用了这个测试数据(test.csv):

    first   second  third
    check1  1   1
    check2  2   2
    check3  3   3
    check4  4   4
    

    这些值由制表符分隔。当我运行你的代码时,

    nt = namedtuple('suminfo', 'a, b, c')
    checklist = ['check1', 'check2', 'check3']
    
    with open('test.csv', 'r') as csv_file:
        csv_rows = csv.DictReader(csv_file, delimiter='\t')
        tups = [nt(row['first'], row['second'], row['third']) 
                for row in csv_rows if row['first'] in checklist]
        print(tups)
    

    我得到以下结果:

    >>> [suminfo(a='check1', b='1', c='1'), suminfo(a='check2', b='2', c='2'), suminfo(a='check3', b='3', c='3')]
    

    【讨论】:

    • 10 美元表示 OP 的文件不是制表符分隔的。
    • @JaredSmith 很抱歉让您失望,但错误似乎在其他地方。我只是复制了自己的代码并独立运行,它达到了我的预期。似乎在某处是一个愚蠢的拼写错误。
    • 感谢您花时间验证它是否有效!
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多