【问题标题】:Finding an exact position of a smaller list inside a list (python)在列表中查找较小列表的确切位置(python)
【发布时间】:2023-03-13 08:54:01
【问题描述】:

所以我有一个类似这样的列表:

list=[10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 9.9, 9.9, 9.9, 10.0, 10.0, 10.0, 10.2, 10.0, 9.9, 9.9, 9.9, 9.9, 10.0, 10.2, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.2, 10.5, 10.9, 10.5, 10.3, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.4, 10.7, 10.3, 10.2, 10.1, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 9.9, 9.9, 10.1, 9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.7, 9.8, 9.8, 9.7, 9.7, 9.7, 9.7, 9.7, 9.7, 9.6, 9.7]

然后我也有一个看起来像这样的子列表:

sublist=[9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8]

现在我需要处理这个较小的列表,我必须找到它在主列表中的位置。 所以在这种情况下,结果应该是这样的:index=119(我可能会选择 +/-1)

我整天都在尝试这样做...并没有在网上找到任何东西... 我有几个想法:

1) 我在列表中找到子列表的第一项......在这种情况下是 4,所以我检查下一个同样正确的数字,然后检查下一个错误的数字,它会发送它在剩余的列表中找到另一个 9.9[4:] 并再次执行相同的循环...直到找到完全匹配

2) 然后另一个想法是以某种方式使用字符串 str(list)[1:-1].find(str(sublist)[1:-1]),在这种情况下会给出 687 的答案...

这些想法的问题是它们似乎冗长而草率,而且我无法使这些想法发挥作用......

【问题讨论】:

    标签: python list indexing find nested-lists


    【解决方案1】:

    怎么样:

    l = [10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 9.9, 9.9, 9.9, 10.0, 10.0, 10.0, 10.2, 10.0, 9.9, 9.9, 9.9, 9.9, 10.0, 10.2, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.2, 10.5, 10.9, 10.5, 10.3, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.4, 10.7, 10.3, 10.2, 10.1, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 9.9, 9.9, 10.1, 9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.7, 9.8, 9.8, 9.7, 9.7, 9.7, 9.7, 9.7, 9.7, 9.6, 9.7]
    subl = [9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8]
    for i in xrange(len(l)-len(subl)):
      if l[i:i+len(subl)] == subl:
        print 'found at pos', i
        break
    else:
      print 'not found'
    

    这会打印出found at pos 118

    附:我已重命名变量,以便list 不会影响内置函数。

    【讨论】:

      【解决方案2】:

      您的第二个想法可能会产生误报:如果子列表是单个值,例如 1,而完整列表只有值 11,它会找到匹配项。如果您在字符串中添加了前导和尾随分隔符,则可以避免这种情况。

      您的第一个想法是最佳解决方案的一半;有一个算法(它的名字现在我不知道)用于确定您可以“重用”多少子字符串,这样您就不必回溯整个字符串。例如,假设您当前的候选人失败了,因为您在期望 9.8 的地方找到了 9.9;您不需要重新访问该元素,因为它匹配子字符串的第一个元素。这些可以预先计算,因此您最终只需一次遍历完整列表。

      【讨论】:

        【解决方案3】:
        ind = l.index(subl[0])
        for i in xrange(l.count(subl[0])-1):
            if l[ind:ind+len(subl)] == subl:
                print (ind)
                break;
            ind = l.index(subl[0],ind+1)
        

        这是一种有效的方法,只有在知道至少存在subl 的第一个值时才会进行比较。

        【讨论】:

          【解决方案4】:
          idx = next(i for i in range(len(lst)-len(sublst)) if lst[i:i+len(sublist)] == sublst)
          # 118
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-14
            • 2017-01-02
            • 2017-09-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多