2017-11-09 14 views
0

API를 사용하여 웹 사이트에서 티켓 번호를 다운로드 한 다음 하나의 ID 인스턴스 만 허용하는 만든 티켓의 고유 티켓 ID를 계산합니다.목록에서 중복을 제거하는 더 빠른 방법

이것은 매우 느립니다 ... 나는 세트를 사용해 보았는데, 그것은 더 나쁩니다. itertools와 같은 다른 도구에 대한 언급은 보았지만 광산과 비슷한 상황에서 어떻게 사용할 수 있는지에 대해서는 명확한 설명이 없습니다.

좋은 변수와 나쁜 변수는 내가 말할 수있는 유형의 Generator를 저장합니다. 도와 줘서 고마워! listgood_array

good = self._client.satisfaction_ratings(score="good",sort_order="asc",start_time=thirty_days,end_time=today) 
    bad = self._client.satisfaction_ratings(score="bad", sort_order="asc", start_time=thirty_days, end_time=today) 
    good_array = [] 
    bad_array = [] 
    for g in good: 
     if g.ticket.id not in good_array: 
      good_array.append(g.ticket.id) 
    for b in bad: 
     if b.ticket.id not in bad_array: 
      bad_array.append(b.ticket.id) 
    goodnum = len(good_array) 
    badnum = len(bad_array) 
+1

설정을 시도 했습니까? 'good_array = {g.ticket.id for g good} '. 그것은 천천히 할 수 없습니다. –

+0

중복 제거에 효과가 있습니까? 다음과 같이 if 문에 다음을 추가합니까? {g.ticket.id, g가 없으면 g에 포함됩니다.} 값이 이미 존재하는지 확인하기 위해 목록을 확인해야한다는 사실 내가 생각하는 속도. – Shezmula

+1

예, 세트는 중복, 업데이트 된 답변을 제거합니다. –

답변

3

if g.ticket.id not in good_array은 이후의 모든 권리는 선형 검색을 사용 느린 (나는 순서는 중요하지 않습니다 이해) set를 사용

만의 고유 요소를 유지하는 완벽한 방법 (그리고

: 가 느려질 수 없습니다 수, 당신은

지금 바로 루프를 드롭 2 세트 함축을 만들 수) 잘못된 방법으로 그들을 사용해야합니다 당신이 그랬던 것처럼

good_array = {g.ticket.id for g in good} 
bad_array = {g.ticket.id for g in bad} 
는 수 :

goodnum = len(good_array) 
badnum = len(bad_array) 
+0

시차는 여전히 아주 적었지만 몇 초 더 빨랐습니다. 아마 59 초 대신 55 초가 걸릴 것입니다. 이것은 세트를 더 잘 이해하는 데 도움이되었습니다. 그렇게 해 주셔서 감사합니다. – Shezmula

+0

큰 데이터를 설정할 때 시간 차이가 더 두드러집니다. –

-1

세트는 중복을 허용하지 않는 파이썬 데이터 타입이다. 단순히 좋고 나쁜 목록을 설정하는 캐스트 -

unique_good = set(good) 
unique_bad = set(bad) 

당신은 당신이 목록을 가지고 같은 방법으로 세트의 길이를 얻을 수 있습니다.

+2

여기에서는'g.ticket.id'에서와 같이 id 대신에'good'과'bad'에있는 항목들로부터 집합을 생성하기 때문에 이것은 동일하지 않습니다. 그것이 이미 기존 답변에서 볼 수 있듯이 목록의 이해가 필요한 이유입니다. 또한 설정하기 위해 캐스팅하지 않고,'set()'함수를 사용하여 새로운 세트를 생성하고 있습니다. –