在该列表上使用连续函数调用构建列表的惯用方法

时间:2012-06-27 12:02:06

标签: python

有一点很难用简洁的标题来解释我在问什么,所以这是解释。我有一个类列表,这些对象都包含自己的数据集。我遇到的问题是我尝试迭代这些对象并过滤掉在列表中当前对象之前的一个对象中使用的数据。代码片段如下所示:

objs = [list-of-objects]
used = set([])
for obj in objs:
    used = used.union(obj.callSomeFunc(used))

callSomeFunc成员返回一组与当前使用的集合不相交的数据。

这段代码有效,但我真的不喜欢它,而且我无法相信没有更好的方法可以做到这一点。

3 个答案:

答案 0 :(得分:2)

我唯一要改变的是使用set.update()代替set.union()

objs = [list-of-objects]
used = set()
for obj in objs:
    used.update(obj.callSomeFunc(used))

可以使用reduce(),但我认为这会损害可读性。

修改:以下是使用reduce()的代码:

used = reduce(lambda used, obj: used.union(obj.callSomeFunc(used)), objs, set())

答案 1 :(得分:1)

如果我理解你的问题,那么我想你正在寻找这样的东西:

objs=[1,19,4,3,1,3,5,1,5,6,7,8,9,18,8,6]
used=[]

for x in objs:
  if x not in used: #only choose that data that is not present in used
    used.append(x)
print(used)     

输出:

[1, 19, 4, 3, 5, 6, 7, 8, 9, 18]

答案 2 :(得分:1)

你也可以递归地表达问题 - 这对某些人来说可能更具可读性。 : - )

def filter_list(used, remaining):
    if len(remaining) == 0:
        return used
    obj = remaining[0]
    return filter_list(used.append(obj.someFunc(used)), remaining[1:])