用于列表和子列表的Python算法

时间:2012-06-23 00:17:12

标签: python algorithm

我有许多可以“打开”或“关闭”的列表,如下所示:

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)

当子列表关闭时,是否有一个简单的算法可以从主列表中删除项目?目标是不删除属于仍处于打开状态的其他列表的项目。

2 个答案:

答案 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,则删除项目。可能比这更有效率。