2012-06-23 42 views
0

我有许多可以“打开”列表或“关闭”,这样的事情:Python的算法列表和子列表

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

我有所有打开的项目的主列表:

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

和开放列表的列表:

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,则删除一件物品。可能比这更有效率。