gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:01:17 24 4
gpt4 key购买 nike

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

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

虽然很丑,但这就是我所拥有的一切。我的测试表明问题是由最后一段代码造成的。

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

最佳答案

这是一种干净的方法:

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,我们可以这样做)。然而,这种方法相当难以阅读,因此我建议不要使用它,仅作为一个示例。

关于python - 使用其自身的简化副本对复杂列表进行重复数据删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10323479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com