首页 文章

如何检查列表的所有元素是否与条件匹配?

提问于
浏览
131

我有一个包含20000个列表的列表 . 我使用每个列表的第3个元素作为标志 . 我想在这个列表上做一些操作,只要至少有一个元素的标志是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 循环中读取所有这些项目,并且它消耗了大量时间!你有什么建议吗?

5 回答

  • 0

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

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

    样品-

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

    你可以像这样使用itertools,一旦满足条件就会停止你的语句 . 相反的方法将会失败

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

    这里最好的答案是使用all(),这是这种情况的内置 . 我们将它与generator expression结合起来,以产生您想要的干净和高效的结果 . 例如:

    >>> items = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
    >>> all(item[2] == 0 for item in items)
    True
    >>> items = [[1, 2, 0], [1, 2, 1], [1, 2, 0]]
    >>> all(item[2] == 0 for item in items)
    False
    

    并且,对于他的过滤器示例,列表理解:

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

    如果要检查至少一个元素是0,更好的选择是使用更可读的any()

    >>> any(item[2] == 0 for item in items)
    True
    
  • 6

    如果要检查列表中的任何项是否违反条件,请使用 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)
    

相关问题