这是指Python: Comparing two CSV files and searching for similar items
中所述的解决方案我想知道语法是什么
masterlist = [row for row in c2]
在解决方案中意味着。
答案 0 :(得分:3)
这是list comprehension,但在这种特殊情况下是无用的。这样做效率更高:
masterlist = list(c2)
因为还将c2
iterable中的所有元素复制到新的列表对象中。
列表推导通常用于过滤或转换迭代中的元素;比如只选择某些行,或者只选择每行中的特定列:
masterlist = [row[1] for row in c2]
只会挑选出引用的答案实际在其代码中使用的一列。
那里接受的答案错过了几个Python习语和最佳实践,并以二次方式运行(处理的持续时间是hosts.csv
大小masterlist.csv
的大小的函数);它应该改写为:
import csv
with open('hosts.csv', 'rb') as hosts, open('masterlist.csv', 'rb') as master:
with open('results.csv', 'wb') as results:
reader = csv.reader(hosts)
writer = csv.writer(results)
master_indices = {r[1]: i for i, r in enumerate(csv.reader(master), 1)}
for row in reader:
index = master_indices.get(row[3])
if index is not None:
message = 'FOUND in master list (row {})'.format(index)
else:
message = 'NOT FOUND in master list'
writer.writerow(row)
在这里,我用字典理解代替了列表理解;创建一个字典,将每个CSV行的第二列映射为行号(使用enumerate()
生成);现在,用于测试该列中row[3]
文件中hosts.csv
是否存在的代码被简化为dict.get()
调用,直接映射到行号。
答案 1 :(得分:1)
通常,列表推导是使用转换表达式将一个列表映射到另一个列表的快速方法。它就像调用map()但使用语法糖一样。
e.g。
list_ = [1, 2, 3, 4, 5] #or range(1, 6)
squares = [x*x for x in list_]
print squares
#[1, 4, 9, 16, 25]