在Python中查找/提取列表中的整数序列

10

我想在一个已排序的列表中找到n个连续的整数序列并返回该序列。这是我能想出的最好方法(当n = 4时),它不允许用户指定n。

my_list = [2,3,4,5,7,9]
for i in range(len(my_list)):
    if my_list[i+1] == my_list[i]+1 and my_list[i+2] == my_list[i]+2 and my_list[i+3] == my_list[i]+3:
        my_sequence = list(range(my_list[i],my_list[i]+4))

my_sequence = [2,3,4,5]

我刚刚意识到这段代码不起作用并返回一个“索引超出范围”的错误,所以我需要调整for循环的范围。


你所说的序列是指差值为1吗? - Anand S Kumar
@AnandSKumar 是的,尽管上面的代码很容易被编辑为搜索差为“m”的序列。 - rspears69
那么只会有一个这样的序列吗? - Anand S Kumar
@AnandSKumar,那是正确的。 - rspears69
你知道这个区别吗?我的意思是,你会手动搜索并给出区别吗?还是让程序尝试找出区别?如果是后者,那么如果列表中有多个序列,有多个不同之处怎么办? - Anand S Kumar
@AnandSKumar 是的,对于我的应用程序,我知道我要寻找的“差异”,并且我知道列表中只有一个序列。 - rspears69
5个回答

5

这里有一个简单明了的解决方案。虽然不是最高效的方法,但除非你有非常长的列表,否则它完全可以胜任:

myarray = [2,5,1,7,3,8,1,2,3,4,5,7,4,9,1,2,3,5]
for idx, a in enumerate(myarray):
    if myarray[idx:idx+4] == [a,a+1,a+2,a+3]:
        print([a, a+1,a+2,a+3])
        break

3
创建一个嵌套的主结果列表,然后遍历my_sorted_list并将每个项目添加到主列表中的最后一个列表(如果不连续)或者添加到主列表中的新列表中(如果连续)。
>>> my_sorted_list = [0,2,5,7,8,9]
>>> my_sequences = []
>>> for idx,item in enumerate(my_sorted_list):
...     if not idx or item-1 != my_sequences[-1][-1]:
...         my_sequences.append([item])
...     else:
...         my_sequences[-1].append(item)
...
>>> max(my_sequences, key=len)
[7, 8, 9]

2

一种简洁的方法是,每当发现下一个整数是当前整数加1时(直到数组中已经有了N个连续数字),就用数字填充数组,对于其他情况,我们可以清空数组:

arr = [4,3,1,2,3,4,5,7,5,3,2,4]
N = 4
newarr = []

for i in range(len(arr)-1):
    if(arr[i]+1 == arr[i+1]):
        newarr += [arr[i]]
        if(len(newarr) == N):
            break
    else:
        newarr = []

当代码运行时,newarr将变为:
[1, 2, 3, 4]

0
#size = length of sequence
#span = the span of neighbour integers
#the time complexity is O(n) 
def extractSeq(lst,size,span=1):
    lst_size = len(lst)
    if lst_size < size:
        return []
    for i in range(lst_size - size + 1):
        for j in range(size - 1):
            if lst[i + j] + span == lst[i + j + 1]:
                continue
            else:
                i += j
                break
        else:
            return lst[i:i+size]
    return []

0
mylist = [2,3,4,5,7,9]
for j in range(len(mylist)):
      m=mylist[j]
      idx=j
      c=j
      for i in range(j,len(mylist)):
               if mylist[i]<m:
                          m=mylist[i]
                          idx=c
               c+=1
      tmp=mylist[j]
      mylist[j]=m
      mylist[idx]=tmp
print(mylist)

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接