2013-10-23 33 views
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 
+1

它需要成为一个列表吗?不能/不应该使用集合数据结构而不是列表? – Jordan

+0

另外,Python不使用';'。 –

+0

@limelights:在我访问python之前就开始使用C#和Java,这是我3年前使用的短时间的语言。因此养成了这种习惯; –

回答

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() 
2

,你可以在使用字典一个相当简单的方式做到这一点。但您需要使用frozenset而不是set,因为集合是可变的,因此不可排列。

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

应该这样做。请注意双反(),因为通常上一个项是保留的项目,您希望第一个,并且双反转完成该项目。

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

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

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

有序字典版本将永远返回

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

然而,常规字典版本可能会返回上面,或者可能返回

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

如果你不”无所谓,无序的字典版本可能会更快/使用更少的内存。

+0

+1,用于很好的分析。 –

+0

感谢您的好回答。 –

相关问题