2017-01-26 1 views
1

적절한 순서로 반복 요소 목록을 인쇄하려면 : 아래는파이썬 스크립트 목록에서 고유 요소를 제거하고 난 단지 반복되는 요소 목록을 목록에서 모든 고유 요소를 제거하고 인쇄하는 스크립트를 작성했습니다

입력 목록 출력 목록

Input list1: 
1,2,1,1,3,5,3,4,3,1,6,7,8,5 

Output List1: 
1,1,1,3,5,3,3,1,5 

Input list2: 
1,2,1,1,3,3,4,3,1,6,5 

Output List2: 
1,1,1,3,3,3,1 

#! /bin/python 

def remove_unique(*n): 
    dict1={} 
    list1=[] 
    for i in range(len(n)): 
     for j in range(i+1,len(n)): 
      if n[i] == n[j]: 
       dict1[j]=n[j] 
       dict1[i]=n[i] 
    for x in range(len(n)): 
     if x in dict1.keys(): 
      list1.append(dict1[x]) 
    return list1 

lst1=remove_unique(1,2,1,1,3,5,3,4,3,1,6,7,8,5) 
for n in lst1: 
    print(n, end=" ") 

어떻게해야 몇 가지 예 스크립트 위의 작동 정확히 몇 작은 목록에서 테스트 할 때 예상대로. 그러나 나는 스크립트 더 큰 길이의 입력 목록에 대한 (고려 시간과 공간의 복잡성)을 최적화하는 방법에 대한 몇 가지 아이디어가 원하는 (50000 < = LEN (목록) < = 50M) 스크립트가 문제의 번호를 가지고

+0

Jean-François는이 문제에 대한 효율적인 해결책을 제시했지만 나중에 참조 할 경우 dict1에서 x가 dict1.keys()에서 x보다 낫습니다. 파이썬 3에서는'.keys()'가 사전에 [View 객체] (https://docs.python.org/3/library/stdtypes.html#dict-views)를 반환하기 때문에 용서할 수 있지만 Python 2 그것은 dict를 스캔하고 키 목록을 만들어야하기 때문에 좋지 않습니다. 그리고'in' 테스트를 수행하기 위해'.keys()'리스트의 선형 스캔을해야합니다. 그리고 'for x in range (len (n)) :'반복문에 대해 _every_ 반복문을 작성하는 것은 매우 비효율적입니다. –

답변

3

:

  • 고전 if x in dict1.keys() =>if x in dict1 대신 선형
  • 없는 지능형리스트의 사전 검사를 사용해야합니다 :로 확대됨에하지, 루프에서 append을. 때문에 이중 루프의
  • O(n^2) 복잡성

내 방식 :

당신은, 다음 발생 회수의 수에 필터를 사용하여 지능형리스트를 사용하여 새 목록을 필터링 collections.Counter를 사용하여 요소를 셀 수

:

from collections import Counter 

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

c = Counter(list1) 
new_list1 = [k for k in list1 if c[k]>1] 

print(new_list1) 

결과 :

[1, 1, 1, 3, 5, 3, 3, 1, 5] 

이 방법의 복잡성은 (대략) O(n*log(n)) (목록의 선형 스캔과 사전의 키 해싱 및 목록 이해의 조회)입니다. 따라서 성능면에서는 좋은 방법입니다.

+0

Fabre : 설명 답을 보내 주셔서 감사합니다. –

관련 문제