我有两个传递给函数的字符串列表。它们或多或少是相同的,除了一个已通过正则表达式过滤器去除某些样板子串(例如从' 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
它很丑陋,但它只是我得到的。我的测试表明问题是由最后一块代码创建的。
非常感谢修改或全新方法。我的下一步是尝试使用词典。
答案 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)
为什么要使用并行列表?为什么不是单个类实例列表?这样可以轻松地对事物进行分组,并减少列表查找。