2

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

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

我想评估对于具有 (start, end) 索引的给定元组,列表是否包含一个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 中做到这一点?

4

5 回答 5

8
>>> 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
于 2012-07-08T09:57:25.370 回答
3

你可以做:

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

如果给定的可迭代对象包含 ,则该函数any返回 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
于 2012-07-08T09:57:27.503 回答
2

蟒蛇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])
于 2012-07-08T10:16:10.823 回答
1

您的代码有一个错误。

对此还有一个变体,它表示计算机科学中有两件困难的事情:缓存失效、命名事物和一个错误。

您的示例列表显示“结束”是inclusive(0,0)并且(5,5)都选择长度为 1 的子列表。

但是range(0,0)andrange(5,5)将第二个“结束”视为排他性range(0,0)并且range(5,5)是索引的空列表。

您需要将 1 添加到范围调用的“结束”索引,以使您的代码按预期工作。

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

于 2012-07-08T10:00:04.553 回答
0

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

import numpy as np

那么你的函数可能如下所示:

def contains_true(list,tupel):
    if l[tupel[0]:tupel[1]].any()==True: 
        return True
    else: 
        return False
于 2012-07-08T10:07:36.273 回答