当列表中的元素列出自身时,删除重复项并保留顺序

时间:2013-10-23 14:22:29

标签: python

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

例如:

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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 reverse(),因为通常 last 项是保留的项,您希望第一个,双重反转可以实现。

编辑:更正,是的,根据史蒂文的答案,它必须是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版本可能更快/使用更少的内存。