将配对等效值列表转换为所有等效值列表的算法?

时间:2019-06-18 19:25:06

标签: python algorithm list

我正在开发一个程序,该程序需要能够从列表列表中删除重复的值。但是,我只能通过成对比较来识别重复值。完成比较后,我会得到一个等效对的列表。但是我需要所有等效值的列表进行进一步处理,以确定哪些重复值可以保留。

我整理了一些似乎适用于一些元素的代码,但是当我尝试将其用于包含数千个条目的列表时,它在负载下无法正常工作。我正在使用的代码是:


    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个月内再次使用它。感谢任何对正确算法有任何建议的人。

2 个答案:

答案 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]}