我在python中遇到两个非常大的文件(每个超过1.000.000个条目)的问题: 我需要生成一个过滤器,我不知道为什么,我有两个这样的文件:
1,2,3
2,4,5
3,3,4
和第二个
1,"fege"
2,"greger"
4,"feffg"
每个文件行的第一项始终是ID。现在我想过滤列表,第一个列表只包含ID在第二个文件中的项目。对于此示例,结果应为:
1,2,3
2,4,5
如何以非常快的方式做到这一点?核心问题是,每个列表都非常长。我用s.th.像这样:
[row for row in myRows if row[0] == item[0]]
但这需要很长时间才能投掷。 (超过30天)
答案 0 :(得分:7)
[row for row in myRows if row[0] == item[0]]
正在为每个item
进行线性扫描。如果您改为使用set
,则可以将其降低到预期的恒定时间操作。首先,读入第二个文件以获得set
个有效ID:
with open("secondfile") as f:
# note: only storing the ids, not the whole line
valid_ids = set(ln.split(',', 1)[0] for ln in f)
然后,您可以使用集合valid_ids
作为
with open("firstfile") as f:
matched_rows = [ln for ln in f if ln.split(',')[0] in valid_ids]
答案 1 :(得分:1)
我假设您只对第一个字段感兴趣。如果是这样,您可以尝试类似:
def _id(s):
return s[:s.index(',')]
ids = {}
for line in open('first-file'):
ids[_id(line)] = line
for line in open('second-file'):
k = _id(line)
if k in ids:
print ids[k]