在列表中按特定顺序搜索项目

时间:2017-11-11 23:20:15

标签: python python-3.x list

尝试学习如何搜索"类似模式" Python中列表中的序列,即查找列表中是否存在特定的整数序列。

我最好的想法是检查a)是否存在所有三个数字b)以查看它们的指数是否相继大于彼此。但是我得到了如此无法接受的输出:

import org.jpl7.JPL;
import org.jpl7.Query;
import org.jpl7.Term;

public class PrologApp {
    public static void main(String[] args) {
        Query.hasSolution("use_module(library(jpl))"); // only because we call e.g. jpl_pl_syntax/1 below
        Term swi = Query.oneSolution("current_prolog_flag(version_data,Swi)").get("Swi");
        System.out.println("swipl.version = " + swi.arg(1) + "." + swi.arg(2) + "." + swi.arg(3));
        System.out.println("swipl.syntax = " + Query.oneSolution("jpl_pl_syntax(Syntax)").get("Syntax"));
        System.out.println("swipl.home = " + Query.oneSolution("current_prolog_flag(home,Home)").get("Home").name());
        System.out.println("jpl.jar = " + JPL.version_string());
        System.out.println("jpl.dll = " + org.jpl7.fli.Prolog.get_c_lib_version());
        System.out.println("jpl.pl = " + Query.oneSolution("jpl_pl_lib_version(V)").get("V").name());
    }
}

有人可以查明上述代码逻辑中的缺陷吗?

2 个答案:

答案 0 :(得分:0)

您的代码按预期工作。它只是测试索引的值是否小于彼此。它不会检查它们是否在列表中彼此直接相邻:

>>> first, second, third = (20, 56, 2)                                          
>>> test_list = [43, 12, 20, 20, 56, 56, 2, 4, 98, 20]
>>> if all([x in test_list for x in [first, second, third]]):
...    if test_list.index(first) < test_list.index(second) < test_list.index(third):
...        print('output1')                                                        
...    else:
...        print('output2')
... 
output1
>>> print(test_list.index(first))
2
>>> print(test_list.index(second))
4
>>> print(test_list.index(third))
6

答案 1 :(得分:0)

可能太先进,但很难抵抗'一线'理解......

ns = [20, 56, 2]
tl = [43, 12, 20, 20, 56, 56, 2, 4, 98, 20]

[sum(a == b for a, b in zip(ns, tl[i:])) for i in range(len(tl)-len(ns)+1)]

Out[31]: [0, 0, 1, 2, 2, 0, 0, 0]

模式松散地说'卷积':在另一个列表ns上并行地逐渐滑动'核心'tl,在匹配的位置值之间进行一些操作,对结果求和并收集总和在列表中的每个增量

for i in range(len(tl)-len(ns)+1)生成索引i

a == b for a, b in zip(ns, tl[i:])sum()

中的生成器表达式

zip(ns, tl[i:])与从ns开始的tl相同的长度切片并排排列i

zip会自动丢弃ecxcess tl元素

我们可以sum来自a == b的布尔结果,因为'鸭子打字'会将TrueFalse转变为10

输出[0, 0, 1, 2, 2, 0, 0, 0]nstl[i:] i i range(len(tl)-len(ns)+1)ns之间匹配数量的列表t1@if (auth()->user()->customer->package_id>0) <li class="btn_disabled"> Allready Purchased</li> @elseif(auth()->user()->customer->package_id==null) <li class="buttonprice"><a href="{{route('updatepackage')}}">Purchase</a></li> @endif 完全重叠的地方