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_Contains_Sub Array - Fatal编程技术网

Python 如果列表在其他列表中,则布尔表达式

Python 如果列表在其他列表中,则布尔表达式,python,list,contains,sub-array,Python,List,Contains,Sub Array,检查一个列表是否在另一个列表中的有效方法是什么?比如: [2,3] in [1,2,3,4] #evaluates True [1,5,4] in [5,1,5,4] #evaluates True [1,2] in [4,3,2,1] #evaluates False 清单中的顺序很重要 def check_ordered_sublist_in_list(sub_list, main_list): sub_list = np.array(sub_list)

检查一个列表是否在另一个列表中的有效方法是什么?比如:

[2,3] in [1,2,3,4]      #evaluates True
[1,5,4] in [5,1,5,4]    #evaluates True
[1,2] in [4,3,2,1]      #evaluates False
清单中的顺序很重要

def check_ordered_sublist_in_list(sub_list, main_list):
    sub_list = np.array(sub_list)
    main_list = np.array(main_list)
    return any(all(main_list[n:(n + len(sub_list))] == sub_list) 
               for n in range(0, len(main_list) - len(sub_list) + 1))

>>> check_ordered_sublist_in_list([2, 3], [1, 2, 3, 4])
True

>>> check_ordered_sublist_in_list([1, 5, 4], [5, 1, 5, 4])
True

>>> check_ordered_sublist_in_list([1, 2], [4, 3, 2, 1])
False
这将列表转换为numpy数组(为了计算效率),然后使用切片检查
子列表是否包含在切片中。任何成功都返回True。

您可以使用以下选项:

def is_in(short, long):
    return any(short==long[i:i+len(short)] for i in range(len(long)-len(short)+1))

is_in([2,3], [1,2,3,4])   # True
is_in([1,5,4], [5,1,5,4]) # True
is_in([1,2], [4,3,2,1])   # False
如果您真的关心速度,则以下表达式的速度将提高20-30%:

def segments(long, length):
    return [long[i:i+length] for i in range(len(long)-length+1)]

def is_in_seg(short, long):
    return short in segments(long, len(short))

is_in_seg([1,5,4], [5,1,5,4])      # true
[1,5,4] in segments([5,1,5,4], 3)  # true
这比以前快了47%,但它使用元组而不是列表:

import itertools
def segments_zip(long, length):
    return itertools.izip(*[long[i:] for i in xrange(length)])

(2,3) in segments_zip((1,2,3,4), 2)    # True
(1,5,4) in segments_zip((5,1,5,4), 3)  # True
(1,2) in segments_zip((4,3,2,1), 2)    # False

额外的速度来自于使用itertools.izip,它可以在找到匹配项时停止生成段;避免使用xrange,从而避免创建整个范围列表;而元组的使用通常比列表稍快一些。但是,如果必须将列表转换为元组才能使用它,那么微小的速度优势就会消失。

第一个列表中的元素是否需要在第二个列表中连续?例如,[1,3,2]
中的
[1,2]应该返回什么?false,因为它必须是连续的。这个问题与假设数据是二进制的并使用串联的问题完全不同。这里的数据可以是任何数值,例如[2,55,100]。在这种情况下,“重复”问题中建议的解决方案不适用。@Alexander-该问题的OP没有仅指定二进制数据,并且有适用于此数据的答案/解决方案。-特别是投票最多的答案。实际上,处的问题与此问题相同,最上等的答案也适用于此(与我下面的答案一致)。这似乎是对
numpy
的滥用。构造
np.array
s是一个相当昂贵的操作。这很可能会抵消使用
numpy
仅执行一些简单切片所获得的任何计算效率(特别是因为示例中的列表非常小)。@pzp可能,但在这个简单示例中,列表非常小。实际用例往往要复杂得多。但是,我同意@mfripp提出的
解决方案更有效。在函数名中使用“ordered_sublist”似乎是多余的,不是所有列表都在Python中排序吗?@martineau是的,所有列表都是有序的。函数标题旨在澄清[1,2]在[1,2,3,4]中,但[2,1]不是。订购事宜由OP澄清,并用于区分无序集合。例如,最初的回复错误地使用了集合。OP从未询问过无序集合,只有当一个列表是另一个列表的子列表时。因为两者都是列表,所以都是按定义排序的。