Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-计算列表子集的元素_Python_List_Python 2.7 - Fatal编程技术网

Python-计算列表子集的元素

Python-计算列表子集的元素,python,list,python-2.7,Python,List,Python 2.7,我有一个包含布尔值的列表: 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,

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

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])
如果给定的iterable包含
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

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

还有一种说法是,有两件事很难做到 在计算机科学中:缓存失效、命名和逐个关闭 错误

您的示例列表显示“end”是包含的,
(0,0)
(5,5)
都选择长度为1的子列表

但是
range(0,0)
range(5,5)
将第二个“end”视为独占,而
range(0,0)
range(5,5)
是索引的空列表

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


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

您的列表应该是一个numpy数组,因此:

import numpy as np
然后,您的函数可以如下所示:

def contains_true(list,tupel):
    if l[tupel[0]:tupel[1]].any()==True: 
        return True
    else: 
        return False
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])


您的列表与[true]或[false]定义的列表之间的交集如何?将列表名称更改为
my_list
,因为
list
会使内置的默认情况下建议您使用半开范围。下面的答案使用
[start,end+1]
来获得答案,但是如果元组
(0,3)
意味着包含元素0、1和2,那么答案会更简单。这不会像提问者希望的那样-如果你看到他的例子,他希望结束边界加上一。@Lattyware:谢谢,我添加了一个+1来给出所需的结果。这不是答案-问题是是否有更好的方法,而不是用他现有的代码来解释问题。这更适合作为一个评论。@Lattyware-true,这就是为什么我在你的评论的同时附加了我的itertools建议。干杯。@Chris谢谢!抢手货简化这个例子我就输了。我喜欢它,因为它很好而且清晰,除了变量名的大写字母
L
——根据pep8,参数等局部变量是带大写字母的小写字母。@Lattyware pep8在尝试使用“L”时说
,用“L”代替。
你的意思是带下划线的
小写字母吗?
L是用python命名列表的惯例吗?@armandino我喜欢这样认为,但它没有写在任何地方。越来越多的人使用
lst
数据
以及类似的东西that@jamylak哇,不知道我是如何设法得到大写的小写字母的-你是对的,这是推荐的。也就是说,我会选择
seq
,因为这是许多内置函数所使用的。你是说tuple吗?还有,你不能只写
返回l[tupel[0]:tupel[1]].any()
?或者更简单的
重新运行l[tupel[0]:tupel[1].any()
不要使用
列表
tuple/tupel
作为名称,因为你正在跟踪bult-ins+1我不知道你可以这样使用函数参数名称为什么要使用
lambda
?作为一个
def
,这看起来会好得多。我不确定这是否比我的解决方案更好。。。看起来不错。@SimeonVisser我也不知道,所以我想这意味着我的方式是公认的方式。@Simeon Visser:对不起,我忘了。我添加了一个Python3版本。