Python-评估列表子集的元素



我有一个包含布尔值的列表:

my_list = [False, False, False, True, True, True]

我想评估一个具有(开始,结束)索引的给定元组的列表是否包含True值,例如

contains_true(my_list, (0,0)) => False
contains_true(my_list, (0,2)) => False
contains_true(my_list, (0,3)) => True
contains_true(my_list, (3,5)) => True
contains_true(my_list, (5,5)) => True

目前我正在做这个:

def contains_true(my_list, indexes_tuple):
    start = indexes_tuple[0]
    end = indexes_tuple[1] + 1
    indexes = range(start, end)
    for i in indexes:
        if my_list[i]:
            return True
    return False

在Python中有更好的方法吗?

>>> my_list = [False, False, False, True, True, True]
>>> def contains_true(seq, bounds):
        start, end = bounds
        return any(seq[start:end+1])
>>> contains_true(my_list, (0,0))
False
>>> contains_true(my_list, (0,2))
False
>>> contains_true(my_list, (0,3))
True
>>> contains_true(my_list, (3,5))
True
>>> contains_true(my_list, (5,5))
True

你可以做:

def contains_true(data, indices):
     return any(data[indices[0]:indices[1] + 1])

如果给定的可迭代项包含True,则函数any返回True。上面的函数对列表进行切片,如果切片至少包含一个True值,则返回True。这给出了您的预期结果:

contains_true(my_list, (0,0)) => False
contains_true(my_list, (0,2)) => False
contains_true(my_list, (0,3)) => True
contains_true(my_list, (3,5)) => True
contains_true(my_list, (5,5)) => True

Python 2:

contains_true = lambda L, (start, end): any(L[start:end+1])

或者在Python 2&3:

contains_true = lambda L, start_end: any(L[start_end[0]:start_end[1]+1])

您的代码有一个off-by-one错误。

这方面也有一个变体,即有两件困难的事情计算机科学中的缓存失效、命名和逐个关闭错误。

示例列表显示"end"包含(0,0)(5,5)都选择长度为1的子列表。

range(0,0)range(5,5)将第二个"端"视为互斥,并且range(0,0)range(5,5)是空的索引列表。

您需要在范围调用的"end"索引中添加1,以使代码按预期工作。

有更好的方法吗?您可以使用import itertoolsitertools.islice来获取子列表,并将其传递给any函数。这对你更好吗?

您的List应该是一个numpy数组,所以:

import numpy as np

然后你的功能可能看起来像这样:

def contains_true(list,tupel):
    if l[tupel[0]:tupel[1]].any()==True: 
        return True
    else: 
        return False

最新更新