列表理解namedtuples导致空列表

时间:2017-04-19 08:39:22

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

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

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]

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

为什么listcomprehension的行为不符合预期?谢谢你的时间。

1 个答案:

答案 0 :(得分:2)

列表理解对我有用。我使用了这个测试数据(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')]