我有一个包含布尔值的列表:
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中有更好的方法吗?
答案 0 :(得分: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
答案 1 :(得分:3)
你可以这样做:
def contains_true(data, indices):
return any(data[indices[0]:indices[1] + 1])
如果给定的iterable包含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
答案 2 :(得分:2)
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])
答案 3 :(得分:1)
您的代码有一个错误。
这也有一个变化,说有两件事情 在计算机科学中:缓存失效,命名事物和一个一个 错误。
您的示例列表显示“结束”为包含,(0,0)
和(5,5)
都选择长度为1的子列表。
但是range(0,0)
和range(5,5)
将第二个“结束”视为独占,range(0,0)
和range(5,5)
是空列表索引。< / p>
您需要在范围调用的“结束”索引中添加1,以使代码按预期工作。
有更好的方法吗?您可以使用import itertools
和itertools.islice
获取子列表,并将其传递给any
函数。这对你更好吗?
答案 4 :(得分: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