0

我在尝试进行一些节点分析时遇到以下问题:

例如:

my_list=[[1,2,3,1],[2,3,1,2],[3,2,1,3]]

我想编写一个函数,以下列方式处理 my_list 中的 element_list:

- my_list 列表中某些元素出现的次数并不重要,只要列表中的唯一元素相同,它们就相同。

根据上述前提找到相同的循环,只保留第一个,忽略其他相同的 my_list 列表,同时保留顺序。

因此,在上面的例子中,函数应该只返回第一个列表,即 [1,2,3,1],因为 my_list 中的所有列表基于上述前提都是相等的。

我在 python 中编写了一个函数来执行此操作,但我认为它可以缩短,我不确定这是否是一种有效的方法。这是我的代码:

def _remove_duplicate_loops(duplicate_loop):

        loops=[]
        for i in range(len(duplicate_loop)):

            unique_el_list=[]

            for j in range(len(duplicate_loop[i])):
                if (duplicate_loop[i][j] not in unique_el_list):
                    unique_el_list.append(duplicate_loop[i][j])

            loops.append(unique_el_list[:])

        loops_set=[set(x) for x in loops]
        unique_loop_dict={}

        for k in range(len(loops_set)):
            if (loops_set[k] not in list(unique_loop_dict.values())):
                unique_loop_dict[k]=loops_set[k]

        unique_loop_pos=list(unique_loop_dict.keys())

        unique_loops=[]

        for l in range(len(unique_loop_pos)):
            unique_loops.append(duplicate_loop[l])

        return unique_loops
4

2 回答 2

4
from collections import OrderedDict
my_list = [[1, 2, 3, 1], [2, 3, 1, 2], [3, 2, 1, 3]]

seen_combos = OrderedDict()
for sublist in my_list:
    unique_elements = frozenset(sublist)
    if unique_elements not in seen_combos:
        seen_combos[unique_elements] = sublist
my_list = seen_combos.values()
于 2013-10-23T14:38:25.147 回答
2

您可以使用字典以一种相当简单的方式进行操作。但是您需要使用frozenset而不是set,因为集合是可变的,因此不可散列。

def _remove_duplicate_lists(duplicate_loop):
     dupdict = OrderedDict((frozenset(x), x) for x in reversed(duplicate_loop))
     return reversed(dupdict.values())

应该这样做。注意 double reversed() 因为通常最后一个项目是保留的项目,你想要第一个,并且 double reverses 完成了这一点。

编辑:更正,是的,根据史蒂文的回答,它必须是 OrderedDict(),否则返回的值将不正确。他的版本可能也会稍微快一点..

再次编辑:如果列表的顺序很重要,您需要一个有序的字典。说你的清单是

[[1,2,3,4], [4,3,2,1], [5,6,7,8]]

有序的 dict 版本将始终返回

[[1,2,3,4], [5,6,7,8]]

但是,常规 dict 版本可能会返回上述内容,也可能会返回

[[5,6,7,8], [1,2,3,4]]

如果您不在乎,无序的 dict 版本可能会更快/使用更少的内存。

于 2013-10-23T14:40:09.360 回答