如何在python中创建高效过滤器

如何在python中创建高效过滤器,python,Python,我在python中遇到了两个非常大的文件(每个文件的条目都超过1.000.000)的问题: 我需要生成一个过滤器,我不知道为什么,我有两个文件如下: 1,2,3 2,4,5 3,3,4 [row for row in myRows if row[0] == item[0]] 第二个呢 1,"fege" 2,"greger" 4,"feffg" 每个文件行的第一项总是ID。现在我想过滤列表,第一个列表只包含ID在第二个文件中的项目。对于本例,结果应为: 1,2,3 2,4,5 如何快速制作

我在python中遇到了两个非常大的文件(每个文件的条目都超过1.000.000)的问题: 我需要生成一个过滤器,我不知道为什么,我有两个文件如下:

1,2,3
2,4,5
3,3,4
[row for row in myRows if row[0] == item[0]]
第二个呢

1,"fege"
2,"greger"
4,"feffg"
每个文件行的第一项总是ID。现在我想过滤列表,第一个列表只包含ID在第二个文件中的项目。对于本例,结果应为:

1,2,3
2,4,5
如何快速制作?核心问题是,每个列表都很长。我用s.th。像这样:

1,2,3
2,4,5
3,3,4
[row for row in myRows if row[0] == item[0]]
但这需要很长时间才能完成。(超过30天)

正在对每个
项目进行线性扫描。如果改用
集合
,则可以将其降低到预期的恒定时间操作。首先,读入第二个文件以获取有效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)
然后,您可以使用set
valid\u id
as筛选第一个文件的行

with open("firstfile") as f:
    matched_rows = [ln for ln in f if ln.split(',')[0] in valid_ids]

我想你只对第一个领域感兴趣。如果是这样,您可以尝试以下方法:

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]

不,它们没有被订购,但可以提前订购。如果可以提前订购,它们是如何生成的?如果它们在某种数据库中,它不能在导出之前执行联接或类似的操作吗?你能将这两个文件都读入内存吗?@gradicius即使是第二个文件的键也可以通过它的外观来完成