我正在开发一个程序,该程序需要能够从列表列表中删除重复的值。但是,我只能通过成对比较来识别重复值。完成比较后,我会得到一个等效对的列表。但是我需要所有等效值的列表进行进一步处理,以确定哪些重复值可以保留。
我整理了一些似乎适用于一些元素的代码,但是当我尝试将其用于包含数千个条目的列表时,它在负载下无法正常工作。我正在使用的代码是:
seen = []
holding = []
for dup_pair in all_dup_pairs:
if dup_pair[0] not in seen and dup_pair[1] not in seen and dup_pair[0] not in holding:
holding.append(dup_pair[0])
holding.sort()
seen.append(dup_pair[0])
seen.append(dup_pair[1])
seen.sort()
if dup_pair[1] not in seen:
seen.append(dup_pair[1])
seen.sort()
for item in holding:
final_duplicates.append([item])
for dup_pair in all_dup_pairs:
for i in range(len(final_duplicates)):
if dup_pair[0] in final_duplicates[i] and dup_pair[1] not in final_duplicates[i]:
final_duplicates[i].append(dup_pair[1])
(是的,我知道它效率低下且难看)
因此,例如,如果原始元素为[a,c,a,a,b,b,d,e,b,c],我将从dup_pairs开始为[[0,2],[0 ,3],[1,9],[2,3],[4,5],[4,8],[5,8]],最后我要以final_duplicates为[[0,2, 3],[1,9] [4,5,8]]。就像我说的那样,代码可以在像这样的小示例上运行,但是在我需要生产的列表的更大版本上却无法运行,并且我不仅要尝试修复代码,还想尝试“正确” ”,这样当问题再次出现时,我实际上可以在18个月内再次使用它。感谢任何对正确算法有任何建议的人。
答案 0 :(得分:2)
您可以这样做:
import re
x = ["a","c","a","a","b","b","d","e","b","c"]
s = ''.join(x)
[(v, [m.start() for m in re.finditer(v, s)]) for v in set(x)]
结果是:
[('c', [1, 9]), ('d', [6]), ('e', [7]), ('b', [4, 5, 8]), ('a', [0, 2, 3])]
答案 1 :(得分:0)
查看以下内容:
def gum(l):
g = {}
for i, k in enumerate(l):
g.setdefault(k, []).append(i)
return g
x = 'acaabbdebc'
print(gum(x))
输出:
{'b': [4, 5, 8], 'a': [0, 2, 3], 'e': [7], 'd': [6], 'c': [1, 9]}