计算列表中两个项目之间的距离

时间:2019-04-13 09:27:21

标签: python python-3.x

我正在尝试计算列表中两个项目之间的距离或长度

问题:找到最长子序列的长度,其中不会出现值6。 (如果列表中只有6个,则此数字可以为零。)

例如,在试用版66423612345654中,没有出现值6的最长子序列是12345。这样的距离或长度我们可以说是5

注意:我曾尝试使用跟踪器和for循环,但我想我可能在中断定位方面遇到了问题

Throws=[6,6,2,5,3,6,6,3,6,6,3,6,6,6]
Max=0
Min=0

for i in range (0,len(Throws)):
    Tracker1 = Throws[i]
    if Tracker1==6:
        for k in range (i+1,len(Throws)):
            Tracker2 = Throws[k]
            if Tracker2 ==6 and Throws[k-1]!=6:
                Min = k-i
                if Min>Max:
                    Max=Min
                    break
print(Max)

给定代码的最大值应为3 ,谢谢!

4 个答案:

答案 0 :(得分:1)

易于理解:

THROWS = [6, 6, 2, 5, 3, 6, 6, 3, 6, 6, 3, 6, 6, 6]
CONTROL_NUM = 6

max = 0
count = 0

for current in THROWS:
    if current != CONTROL_NUM:
        count += 1
        if count > max:
            max = count
    else:
        count = 0


print(max)

答案 1 :(得分:0)

使用itertools.groupby

max(len(list(g)) for k, g in groupby(Throws, lambda x: x != 6) if k)

代码

from itertools import groupby

Throws = [6,6,2,5,3,6,6,3,6,6,3,6,6,6]

print(max(len(list(g)) for k, g in groupby(Throws, lambda x: x != 6) if k))
# 3

答案 2 :(得分:0)

您可以使用join()split()使用以下命令将序列转换为字符串并找到最长距离:

throws = [6,6,4,2,3,6,1,2,3,4,5,6,5,4]
max_seq_length = max([len(sub_list)  for sub_list in "".join([str(i) for i in throws]).split("6")])

答案 3 :(得分:0)

单行递归解决方案:

f = lambda s, v: v in s and max(s.index(v), f(s[s.index(v) + 1:], v)) or len(s)

所以,就您而言:

f([6,6,2,5,3,6,6,3,6,6,3,6,6,6], 6))

3作为输出。

主要思想是不包含值的子序列的长度是该值两次连续出现之间的子序列的长度。基本情况是序列中根本不存在该值,因此不包含该值的最长子序列就是子序列本身。

方法index为您提供了第一次出现值的位置,因此不包含该值的序列前缀的长度就是index方法给定的值。递归地,您可以搜索其他前缀,查看从刚发现的出现点到到达输入序列的末尾的立即开始的子序列。

相关问题