如何检查列表的所有元素是否符合条件? [英] How to check if all elements of a list match a condition?

查看:27
本文介绍了如何检查列表的所有元素是否符合条件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含 20000 个列表的列表.我使用每个列表的第三个元素作为标志.我想对这个列表做一些操作,只要至少有一个元素的标志为0,就像:

my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]

一开始,所有标志都是0.我使用while循环来检查是否至少有一个元素的标志是0:

def check(list_):对于 list_ 中的项目:如果项目[2] == 0:返回真返回错误

如果 check(my_list) 返回 True,那么我会继续处理我的列表:

while check(my_list):对于 my_list 中的项目:如果条件:项目[2] = 1别的:do_sth()

实际上,我想在迭代时删除 my_list 中的元素,但是在迭代时不允许删除项目.

原来的 my_list 没有标志:

my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]

因为我在迭代时无法删除元素,所以我发明了这些标志.但是 my_list 包含很多项,并且 while 循环在每个 for 循环中读取所有这些项,并且消耗大量时间!你有什么建议吗?

解决方案

这里最好的答案是使用 all(),这是针对这种情况的内置函数.我们将其与生成器表达式结合起来,以干净、高效的方式生成您想要的结果.例如:

<预><代码>>>>项目 = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]>>>all(flag == 0 for (_, _, flag) in items)真的>>>项目 = [[1, 2, 0], [1, 2, 1], [1, 2, 0]]>>>all(flag == 0 for (_, _, flag) in items)错误的

注意 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)真的

I have a list consisting of like 20000 lists. I use each list's 3rd element as a flag. I want to do some operations on this list as long as at least one element's flag is 0, it's like:

my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]

In the beginning, all flags are 0. I use a while loop to check if at least one element's flag is 0:

def check(list_):
    for item in list_:
        if item[2] == 0:
            return True
    return False

If check(my_list) returns True, then I continue working on my list:

while check(my_list):
    for item in my_list:
        if condition:
            item[2] = 1
        else:
            do_sth()

Actually, I wanted to remove an element in my_list as I iterated over it, but I'm not allowed to remove items as I iterate over it.

Original my_list didn't have flags:

my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]

Since I couldn't remove elements as I iterated over it, I invented these flags. But the my_list contains many items, and while loop reads all of them at each for loop, and it consumes lots of time! Do you have any suggestions?

解决方案

The best answer here is to use all(), which is the builtin for this situation. We combine this with a generator expression to produce the result you want cleanly and efficiently. For example:

>>> 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

Note that all(flag == 0 for (_, _, flag) in items) is directly equivalent to all(item[2] == 0 for item in items), it's just a little nicer to read in this case.

And, for the filter example, a list comprehension (of course, you could use a generator expression where appropriate):

>>> [x for x in items if x[2] == 0]
[[1, 2, 0], [1, 2, 0]]

If you want to check at least one element is 0, the better option is to use any() which is more readable:

>>> any(flag == 0 for (_, _, flag) in items)
True

这篇关于如何检查列表的所有元素是否符合条件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆