2013-10-23 69 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

感謝您的好回答。 –

相關問題