1

我有两个传递给函数的字符串列表。它们或多或少是相同的,除了已经通过正则表达式过滤器运行以删除某些样板子字符串(例如,从“Blues Brothers LLC”中删除“LLC”)。

此函数用于在内部对修改后的列表进行重复数据删除,并删除未修改列表中的关联项。您可以假设这些列表在通过正则表达式过滤器之前按字母顺序排序,并保持相同的顺序(即 original[x] 和 modified[x] 指的是同一个实体,即使 original[x] != modified[ X])。必须在输出中的两个列表之间保持相对顺序。

这就是我到目前为止所拥有的。它在 99% 的时间都有效,除了非常罕见的输入和样板字符串组合(千分之一),其中一些输出字符串将与单个列表位置不匹配。输入列表是“原始的”和“修改的”。

# record positions of duplicates so we're not trying to modify the same lists we're iterating
dellist_modified = []
dellist_original = []

# probably not necessary, extra precaution against modifying lists being iterated.
# fwiw the problem still exists if I remove these and change their references in the last two lines directly to the input lists
modified_copy = modified
original_copy = original

for i in range(0, len(modified)-1):
    if modified[i] == modified[i+1]:
dellist_modified.append(modified[i+1])
dellist_original.append(original[i+1])

for j in dellist_modified:
    if j in modified:
        del modified_copy[agg_match.index(j)]
        del original_copy[agg_match.index(j)]

# return modified_copy and original_copy

这很丑,但这是我的全部。我的测试表明问题是由最后一段代码造成的。

修改或全新的方法将不胜感激。我的下一步是尝试使用字典。

4

3 回答 3

2

这是一种干净的方法:

original = list(range(10))
modified = list(original)
modified[5] = "a"
modified[6] = "a"

def without_repeated(original, modified):
    seen = set()
    for (o, m) in zip(original, modified):
        if m not in seen:
            seen.add(m)
            yield o, m

original, modified = zip(*without_repeated(original, modified))

print(original)
print(modified)

给我们:

(0, 1, 2, 3, 4, 5, 7, 8, 9)
(0, 1, 2, 3, 4, 'a', 7, 8, 9)

我们同时遍历两个列表。我们保留一组我们已经看到的项目(集合具有非常快速的所有权检查),然后产生我们还没有看到的任何结果。

然后我们可以再次使用 zip 给我们两个列表。

请注意,我们实际上可以这样做:

seen = set()
original, modified = zip(*((o, m) for (o, m) in zip(original, modified) if m not in seen and not seen.add(m)))

除了使用单个生成器表达式外,它的工作方式相同,使用条件语句将项目添加到被破解的集合中(因为 add 总是返回 false,我们可以这样做)。但是,这种方法很难阅读,因此我建议不要使用它,这只是一个示例。

于 2012-04-25T21:10:42.823 回答
0

为什么要使用平行列表?为什么不是一个类实例列表?这样可以轻松地将事物分组,并减少您的列表查找。

于 2012-04-25T21:53:28.867 回答
0

python中的Aset是不同元素的集合。这些元素的顺序是否重要?像这样的东西可能会起作用:

distinct = list(set(original))
于 2012-04-25T20:53:07.470 回答