我有许多可以“打开”或“关闭”的列表,如下所示:
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)
当子列表关闭时,是否有一个简单的算法可以从主列表中删除项目?目标是不删除属于仍处于打开状态的其他列表的项目。
答案 0 :(得分: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()
迭代器。
答案 1 :(得分: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,则删除项目。可能比这更有效率。