提问人:alwbtc 提问时间:5/19/2012 最后编辑:Karl Knechtelalwbtc 更新时间:10/18/2023 访问量:511948
如何检查列表的所有元素是否与条件匹配?
How to check if all elements of a list match a condition?
问:
我有一个列表,其中包含许多子列表,每个子列表有 3 个元素,例如:
my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]
每个子列表的最后一个元素是一种标志,对于每个子列表,它最初为 0。随着我的算法的进展,我想检查这个标志是否至少一个元素为 0。目前我使用while循环,如下所示:
def check(list_):
for item in list_:
if item[2] == 0:
return True
return False
只要满足该条件,整个算法就会循环,并在每次迭代中设置一些标志:
while check(my_list):
for item in my_list:
if condition:
item[2] = 1
else:
do_sth()
因为在迭代列表时从列表中删除元素会导致问题,所以我使用这些标志来跟踪已经处理的元素。
如何简化或加快代码速度?
另请参阅检查列表的任何元素的条件是否成立的 Python 方法,以检查任何元素的条件。请记住,“任何”和“所有”检查通过德摩根定律是相关的,就像“或”和“和”是相关的一样。
此处的现有答案都使用内置函数进行
迭代。请参阅 Python 的 any 和 all 函数如何工作? 了解 all
及其对应项 any
的解释。
如果要检查的条件是“在另一个容器中找到”,请参阅如何检查以下所有项目是否都在列表中?及其对应项,如何检查以下项目之一是否在列表中?。使用任何
和所有
方法都可以使用,但更有效的解决方案是可能的。
答:
你可以像这样使用 itertools 的 takewhile,一旦满足一个条件,它就会停止,而你的语句失败了。相反的方法是 dropwhile
for x in itertools.takewhile(lambda x: x[2] == 0, list)
print x
如果要检查列表中是否有任何项目违反条件,请使用:all
if all([x[2] == 0 for x in lista]):
# Will run if all elements in the list has x[2] = 0 (use not to invert if necessary)
要删除所有不匹配的元素,请使用filter
# Will remove all elements where x[2] is 0
listb = filter(lambda x: x[2] != 0, listb)
评论
[...]
all(...)
False
filter()
listb = list(filter(lamba x: x[2] != 0, listb))
这里最好的答案是使用 all(),
这是这种情况的内置。我们将其与生成器表达式相结合,以干净高效地生成您想要的结果。例如:
>>> items = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
>>> all(flag == 0 for (_, _, flag) in items)
True
>>> items = [[1, 2, 0], [1, 2, 1], [1, 2, 0]]
>>> all(flag == 0 for (_, _, flag) in items)
False
请注意,这直接等同于 ,在这种情况下读起来更好一些。all(flag == 0 for (_, _, flag) in items)
all(item[2] == 0 for item in items)
对于筛选器示例,列表推导式(当然,您可以在适当的情况下使用生成器表达式):
>>> [x for x in items if x[2] == 0]
[[1, 2, 0], [1, 2, 0]]
如果你想检查至少一个元素是 0,更好的选择是使用 any(),
它更易读:
>>> any(flag == 0 for (_, _, flag) in items)
True
评论
all()
any()
False
all()
False
all([ cond(i) for i in range (n) ])
all
这种方式比使用更灵活一些:all()
my_list = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
all_zeros = False if False in [x[2] == 0 for x in my_list] else True
any_zeros = True if True in [x[2] == 0 for x in my_list] else False
或更简洁地说:
all_zeros = not False in [x[2] == 0 for x in my_list]
any_zeros = 0 in [x[2] for x in my_list]
评论
all_zeros = False in [x[2] == 0 for x in my_list]
0 in [x[2] for x in my_list]
any_zeros
all()
all_zeros = False in [x[2] == 0 for x in my_list]
False
True
all_zeros = not (False in [x[2] == 0 for x in my_list])
0 in [x[2] for x in my_list]
any_zeros
另一种使用方式。这检查了真实性和过程
(使用itertools.ifilter
lambda
)
样本-
for x in itertools.ifilter(lambda x: x[2] == 0, my_list):
print x
评论
None
[]