두 개의 목록 (listA, listB)이 있는데, 각각 두 개의 튜플 목록으로 구성됩니다.목록이 다른 목록에 있는지 확인하는 방법 python
예. 이 listB에없는 경우
listA = [ [(0,1), (1,2) ... ] , [(5,6), (6,10)] , ... ] # can have 5000 lists, each with 100+ tuples
listB = [...] # about the same structure
내가 중고 장비 구매에 각 목록 전체를 반복하고 싶지, 내가 listB에 추가합니다.
은 그래서이 같은 것입니다 :
for lst in listA:
if lst not in listB: # membership checking
listB.append(lst)
나는 수백 수행하는 등의 작업의 수천을하고 중고 장비 구매 및 listB가 커질 때 정말 느린 것 같다. 회원 확인이 병목 현상 인 것 같습니다. 나는 정수의 튜플 대신에 '0-1'이라는 문자열을 사용하려고 시도했지만 더 빠르게 진행되지는 않습니다. 누구든지 코드를 최적화하는 방법을 알고 있습니까? 목록 회원 확인이 정말로 느 립니 까?
도움을 주시면 대단히 감사하겠습니다. 감사!
------------- 편집 :이 내가
-------------이, 사람을 주셔서 감사합니다 사용하게하는 것이다. 중첩 목록을 튜플로 변환하고 집합 작업 사용 그러나 listA를 반복 할 때 각 중첩 된 목록을 튜플로 변환해야하므로 조심해야합니다 (단, 멤버쉽을 확인하기 위해!). listB에 목록으로 중첩 목록을 추가해야합니다. 즉 : 내가 틀리지 않는 경우 두 목록을 가정
# first convert listB to a set of tuples
listB_as_set = set([tuple(x) for x in listB]) # O(N)
for lst in listA:
# convert the nested list to tuple
lst_tuple = tuple(lst)
# membership checking
if lst_tuple in listB_as_set: # now O(1), originally O(N)
listB.append(lst) # still appending as a list to listB
길이 N이 있고, lst_tuple하는 LST를 변환하는 시간을 무시하고 listB에 LST를 추가, 우리는
O(N)
에
O(N2)
에서 개선을 얻었다.
주문에 신경 쓰지 않는다면리스트 멤버쉽은'O (n)'이고, 중첩리스트를'tuple'로 변환하고'set'을 사용하는 것을 고려하십시오. 멤버쉽 체크를 위해'O (1)'이 설정됩니다. – AChampion
@AChampion listA/listB의 목록 순서는 중요하지 않지만 각 중첩 목록의 경우 (0,1), (1,2), ...이어야합니다. 그래서 중첩 목록을 튜플로 변환하고 결과를 봅니다. 감사! – Hai
'listB' 만 변환하면됩니다. – AChampion