2013-10-23 3 views
0

이 때 순서를 유지 나는 몇 마디 분석하려고 노력하는 동안 다음과 같은 문제가있다 : 예를 들어중복을 제거하고 목록 내부 요소 목록 자체

:

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

내가 함수를 작성 할을 그 my_list 안에있는 element_list를 다음과 같이 처리합니다.

- my_list 목록 내의 특정 요소의 출현 횟수는 중요하지 않으며 목록의 고유 요소 동일하다, 그들은 동일하다.

위의 전제를 기반으로 동일한 루프를 찾고 을 그대로 유지하고 을 그대로 유지하면서 my_list의 다른 동일한 목록을 무시하십시오.

따라서 위의 예에서 함수는 my_list 내부의 모든 목록이 위의 전제에 따라 동일하므로 [1,2,3,1] 인 첫 번째 목록 만 반환해야합니다.

파이썬에서이 작업을 수행하는 기능을 썼지 만 단축 할 수 있다고 생각합니다. 효율적인 방법은 아닌지 잘 모르겠습니다.

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

또한 파이썬은';'을 사용하지 않습니다. –

+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

당신이 사전을 사용하여 매우 간단한 방법으로 그것을 할 수 있습니다 : 여기 내 코드입니다. 하지만 집합이 변경 가능하므로 해시 가능하지 않으므로 set 대신 frozenset을 사용해야합니다.

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

해야합니다. 일반적으로 마지막 항목이 보존되어있는 곳에서 첫 번째로이 필요하고 이중 역전이 수행되기 때문에 double reversed()에 유의하십시오.

편집 : 수정, 예, Steven의 대답에 따라 OrderedDict()가되어야하며 그렇지 않으면 반환 된 값이 올바르지 않습니다. 그의 버전은 약간 더 빠를 수도 있습니다 ..

다시 편집 : 목록의 순서가 중요 할 경우 주문 된 사전이 필요합니다. 정렬 된 DICT 버전은 항상

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

그러나, 일반 DICT 버전이 위를 반환 할 수 반환, 또는 '돈 경우

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

를 반환 할 수 있습니다 귀하의 목록에

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

라고 비 배타적 인 dict 버전은 더 빠르거나 더 적은 메모리를 사용할 수 있습니다.

+0

좋은 분석을 위해 +1. –

+0

좋은 답변 주셔서 감사합니다. –