python中的组合过滤器()不';I don’我没有按预期工作

python中的组合过滤器()不';I don’我没有按预期工作,python,Python,据我所知,以下代码应该输出[[['b']]。 相反,它输出[['a',exclude'],['b']] 这是python中的一个bug,还是我误解了什么 列出\u到\u过滤器=[ ['a','exclude'], ['b'] ] #请注意,当“exclude”是最后一个元素时,代码将返回预期结果 对于['exclude','something']中的exclude_标签: 列表\u至\u过滤器=(如果排除\u标签不在标签\u列表中,则列表中的标签\u列表\u至\u过滤器) #请注意,将上面的行更

据我所知,以下代码应该输出
[[['b']]
。 相反,它输出
[['a',exclude'],['b']]

这是python中的一个bug,还是我误解了什么

列出\u到\u过滤器=[
['a','exclude'],
['b']
]
#请注意,当“exclude”是最后一个元素时,代码将返回预期结果
对于['exclude','something']中的exclude_标签:
列表\u至\u过滤器=(如果排除\u标签不在标签\u列表中,则列表中的标签\u列表\u至\u过滤器)
#请注意,将上面的行更改为下面的注释行(即,将生成器扩展为列表)
#将使代码输出为预期结果,
#也就是说,仅当在另一个过滤器上使用过滤器时才出现问题,而不是在列表上
#lists_to_filter=[标签的标签列表\u列表\u列表中的标签列表\u如果排除\u标签不在标签列表中,则过滤器\u]
lists_to_filter=列表(lists_to_filter)
打印(列表到过滤器)

因为您在循环中多次将
列表指定给过滤器,所以它只返回最后一个结果。这不包括
'something'
,即
['exclude','something']
中的最后一个元素

您可以使用
all
来实现您的目标:

lists_to_filter = [labels_list for labels_list in lists_to_filter if all(exclude_label not in labels_list for exclude_label in ['exclude', 'something'])]
或展开
all
逻辑:

    result = []

    for labels_list in lists_to_filter:
        exclude = False
        for exclude_label in ['exclude', 'something']:
            if exclude_label in labels_list:
                exclude = True
        if not exclude:
            result.append(labels_list)

    print(result)
或者您可以根据您的标题使用
过滤器

lists_to_filter = list(filter(lambda x: all(exclude_label not in x for exclude_label in exclude_labels), lists_to_filter))
输出:

[['b']]

希望这对您有所帮助,如果您还有其他问题,请发表评论。:)

之所以发生这种情况,是因为
列出了过滤器中的过滤器
只在循环之外迭代。在循环之外,您有
exclude\u label==“something”
,这就是为什么您会得到意外的结果。要检查它,您可以放置一行
exclude\u label='exclude'

lists_to_filter = [
    ['a', 'exclude'],
    ['b']
]

for exclude_label in ['exclude', 'something']:
    lists_to_filter = (labels_list for labels_list in lists_to_filter if exclude_label not in labels_list)

exclude_label = 'exclude'
lists_to_filter = list(lists_to_filter)
print(lists_to_filter)  # [['b']]

声明“不能在封闭范围内计算最左侧for子句中的后续for子句和任何筛选条件,因为它们可能取决于从最左侧iterable获得的值。”。在您的情况下,过滤条件
如果排除标签…
取决于从
中为排除标签获取的值。

检查最后一个缩进,
列出要在循环中重新定义的过滤器。这就是为什么代码在“exclude”是最后一个元素时运行。如果将
lists\u to\u filter=list(lists\u to\u filter)
print(lists\u to\u filter)
放在循环中,应该可以工作缩进的目的是——最后两行只是输出。这个问题发生在他们面前——当我做
filter(filter(something))
时,它不会给出与
filter(list(filter(something))相同的输出。这是一个玩具的例子,事实上我的代码更复杂,所以我更喜欢一些不需要我全部使用的东西等等。。。2.我不明白你为什么说循环中的多个任务不起作用。例如,使用
x=2;对于范围(2)内的i:x=x**2
将返回
16
3。如果您是正确的,那么将分配从生成器更改为列表也会保留以前的行为。对于第二点,示例应该是
x=i**2
,因此只保留结果中的最后一个i。如果逻辑复杂,并且您不想使用
all
,则可以扩展块,并实现类似于
all
的功能,或者,您可以使用@John solution,使用set intersection或其他我已经添加了一个带有expand
all
loigc的版本的东西,您正在寻找吗@tsvikasabout
x=x**2
,您可以看到,在您的示例中,以前的
x
将影响新的
x
,因此它在循环中传输值,但在您的列表中理解不是。捕捉得好!我不知道生成器中的变量是惰性计算的。