使用自身的简化副本对复杂列表进行重复数据删除

时间:2012-04-25 20:44:52

标签: python

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

此函数用于对修改后的列表进行内部重复数据删除,并删除未修改列表中的关联项。您可以假设这些列表在运行正则表达式过滤器之前按字母顺序排序,并保持相同的顺序(即原始[x]和modified [x]引用相同的实体,即使原始[x]!=修改[ 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

它很丑陋,但它只是我得到的。我的测试表明问题是由最后一块代码创建的。

非常感谢修改或全新方法。我的下一步是尝试使用词典。

3 个答案:

答案 0 :(得分: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,我们可以这样做)。但是,这种方法难以阅读,所以我建议反对它,只是为了它的一个例子。

答案 1 :(得分:0)

python中的set是不同元素的集合。这些元素的顺序是否至关重要?这样的事情可能有用:

distinct = list(set(original))

答案 2 :(得分:0)

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