2012-06-23 3 views
0

하위 목록에 대한 알고리즘 또는 "폐쇄"이 같은 :파이썬 목록 및 I가 "개방"할 수있는 목록의 번호가

:

lista = ["a", "b", "c"] 
listb = ["d", "e"] 
listc = ["a", "b", "e"] 
listd = ["c", "d"] 

나는 열려있는 모든 항목의 마스터 목록을

all_open = ["a", "b", "c", "e"] 

개방리스트 목록 :

openend 하위 목록이되기 때문에, 그 상품 마스터리스트에 추가된다
open_lists = ["lista", "listc"] 

:

open_lists.append("listb") 
for each i in listb: 
    if !(i in all_open): 
     all_open.append(i) 

하위 목록을 닫을 때 마스터 목록에서 항목을 제거하는 간단한 알고리즘이 있습니까? 목표는 아직 열려있는 다른 목록에 속한 항목을 제거하지 않는 것입니다.

+1

목록 또는 항목이 "열어"란 ** 의미 **는 무엇입니까? –

답변

2

각 항목의 출처 목록을 추적해야합니다. 가장 간단한 방법은지도를 사용하는 것입니다. 이런 식으로 collections.Counter을 사용하고 싶습니다.

import collections 
count = collections.Counter() 

# add a list 
for i in listb: 
    if count[i] == 0: 
     all_open.append(i) 
    count[i] += 1 

# delete a list 
for i in listb: 
    count[i] -= 1 
    if count[i] == 0: 
     all_open.remove(i) 

또한 모두 all_open을 없애 대신 count.keys() 반복자를 사용할 수 있습니다.

+3

(이것은 기본적으로 "참조 카운팅"이라고 불리며 가비지 수집 알고리즘에서 자주 사용됩니다.) – Amber

+0

참조 카운팅은 내가 찾고있는 것입니다. – nathancahill

0

뭔가

all_items = [] 
for l in open_lists: 
    for item in l: 
     if item not in all_items: 
      all_items.append(item) 

all_open = [item for item in all_open if item not in all_items] 

처럼 그게 당신이 요구하는 거라면 내가 너무 명확하지 않다하지만 당신이 원하는 무엇을이 것입니다 결과를 믿는다. 또한 각 항목이 열려있는 횟수를 추적 할 수 있으며 목록을 닫을 때 1 씩 감소시킬 수 있습니다. 값이 0이면 항목을 제거하십시오. 이보다 훨씬 효율적일 수 있습니다.