繁体   English   中英

如何检查列表的所有元素是否符合条件?

[英]How to check if all elements of a list match a condition?

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

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

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

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

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

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

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

原始 my_list 没有标志:

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

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

这里最好的答案是使用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

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)

您可以像这样使用 itertools 的 takewhile,一旦满足使您的语句失败的条件,它将停止。 相反的方法是 dropwhile

for x in itertools.takewhile(lambda x: x[2] == 0, list)
    print x

这种方式比使用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]

另一种使用itertools.ifilter的方法。 这会检查真实性和过程(使用lambda

样本-

for x in itertools.ifilter(lambda x: x[2] == 0, my_list):
    print x

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM