在for循环中的另一个列表项之后创建列表名称

时间:2017-10-14 07:04:22

标签: python list loops

我是python和编程的新手。我开始看视频和阅读书籍,但我也做了一个项目而且我被卡住了。 所以我有一个清单

list_ot = [123, 234, 774, 539, 492, 556]

我有一个像这样的csv文件:

Sin, ot, cant
1, 123, 999
12, 234, 888
23, 123, 768
22, 774, 442

打开csv文件后,我想创建一个for循环来创建以第一个列表中的项目命名的列表,以根据if语句在其中保存一些行。像这样的东西,

Reader = CSV.dictreader(file)

for i in list_ot:
    for row in reader:
        if I == row['ot']:
            (List_named_i).append(row)

请帮帮我:)。

2 个答案:

答案 0 :(得分:1)

正如评论中所提到的,在循环中动态创建列表名称​​ 不是。相反,您应该使用列表或字典之类的集合来保存列表。我将在下面展示如何做到这一点。

我还提到做这种事情是行不通的:

for i in list_ot:
    for row in reader:

在外部for i in list_ot:循环的第一次运行中,我们读取内部for row in reader:循环中的整个文件。然后当我们进入list_ot循环的第二次运行时,文件光标仍将位于文件的末尾,因此将不会有任何数据要读取,并且内部循环将立即完成。我们可以使用文件的.seek方法将文件光标重置为文件的开头,但最好避免多次重读相同的文件数据。

相反,当我们读取一行时,我们需要检查其“ot”字段是否与list_ot中的一个值匹配,如果是,我们可以将该行保存到相应的列表中。

下面的代码显示了如何将数据保存到列表字典中。请仔细研究!此代码设计为在Python 3上运行,但它也应该在Python 2上正确运行(尽管严格来说,您应该在Python 2中以二进制模式打开CSV文件)。

csv.DictReader会产生一行OrderedDict。如果您需要保留行中字段的顺序,这可能很方便,但如果您不需要保留订单,则可以轻松地将OrderedDict转换为普通dict,是代码在将行保存到mylists字典时所执行的操作。

import csv

list_ot = [123, 234, 774, 539, 492, 556]

# Create a dict of empty lists, with the numbers in list_ot as the keys
mylists = {k: [] for k in list_ot}

with open('data', 'r') as f:
    reader = csv.DictReader(f, skipinitialspace=True)
    for row in reader:
        print(row)
        ot = int(row['ot'])
        if ot in mylists:
            mylists[ot].append(dict(row))
print()

for k in list_ot:
    print(k, mylists[k])

<强>输出

OrderedDict([('Sin', '1'), ('ot', '123'), ('cant', '999')])
OrderedDict([('Sin', '12'), ('ot', '234'), ('cant', '888')])
OrderedDict([('Sin', '23'), ('ot', '123'), ('cant', '768')])
OrderedDict([('Sin', '22'), ('ot', '774'), ('cant', '442')])

123 [{'Sin': '1', 'ot': '123', 'cant': '999'}, {'Sin': '23', 'ot': '123', 'cant': '768'}]
234 [{'Sin': '12', 'ot': '234', 'cant': '888'}]
774 [{'Sin': '22', 'ot': '774', 'cant': '442'}]
539 []
492 []
556 []

答案 1 :(得分:0)

另一个更简单的替代方案是使用熊猫。请考虑以下代码:

example.csv:

import pandas as pd
list_ot = [123, 774, 539, 492, 556]  # Removed 234 from your list for verification
df_csv = pd.read_csv('example.csv')
list_named_i = df_csv[df_csv.ot.isin(list_ot)]
print(list_named_i)

代码:

   Sin   ot  cant
0    1  123   999
2   23  123   768
3   22  774   442

输出:

12 3