3

我在 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 天)

4

2 回答 2

7
[row for row in myRows if row[0] == item[0]]

正在对每个 进行线性扫描item。如果您改用 a 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)

然后您可以使用 set 过滤第一个文件的valid_ids

with open("firstfile") as f:
    matched_rows = [ln for ln in f if ln.split(',')[0] in valid_ids]
于 2013-05-20T14:13:00.583 回答
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]
于 2013-05-20T14:18:36.043 回答