在未排序的Python列表中查找连续的整数

时间:2019-03-17 20:38:56

标签: python list

我正在尝试从未排序的列表中查找连续的值。实验代码如下:

num = [8,9,4,1,2,3]

#(num[0+1])  next value

for i in range(len(num)-1):  # not using -1 will cause index error
    if num[i]+1==num[i+1]:
        print('Con',num[i])

问题:使用当前代码无法获取最后一个值。我的输出不包括最后一个值。这就是我得到的(没有9或没有3):

Con 8
Con 1
Con 2

我看到了一些复杂的解决方案,这些对我来说很难理解。是否可以稍微调整for循环部分并获得整个序列?非常感谢。

5 个答案:

答案 0 :(得分:2)

您的代码仅在一个方向上进行测试(后跟一个连续的数字)。 对于完整序列,您必须在两个方向上进行测试。

num=[8,9,4,1,2,3]

assert(len(num) > 1)
for i, n in enumerate(num):
    if i != 0:
        if n == num[i-1] + 1:
            print("Con", n)
            continue
    if i != len(num) - 1:
        if n == num[i+1] - 1:
            print("Con", n)

答案 1 :(得分:1)

这是因为您仅检查 next 号。当您想要第二个数字(例如9或3)时,还必须包括对上一个数字的检查。这会使if更长一些,但是可以使用。

num=[8,9,4,1,2,3]

for i in range(len(num)):
    if (
        (  # check for the next number
            i + 1 != len (num) and  # don't check the end of the list
            num[i]+1==num[i+1] 
        ) or (  # check for the previous number
            i != 0 and  # don't check before the list
            num [i-1] == num [i] - 1
        )
    ): print('Con',num[i])

此外,我还必须删除您范围内的-1,因为我已经进行了手动检查,并且指出,这阻止了显示3。

答案 2 :(得分:0)

一种方法是,当您发现两个数字都是连续的时,将它们打印出来,同时还要检查索引i-1上的数字是否也不在连续列表中,以便索引{{1} }不会打印两次:

i

也可以尝试使用更复杂的列表:

num = [8, 9, 4, 1, 2, 3]

for i in range(len(num)-1):  # not using -1 will cause index error
    if num[i] + 1 == num[i + 1]:
        if i == 0 or (i - 1 >= 0 and num[i - 1] != num[i] - 1):
            print('Con', num[i])
        print('Con', num[i + 1])

答案 3 :(得分:0)

num = [8, 9, 4, 1, 2, 3]

def con(rng, pos=0):
    if pos < len(rng):
        if (pos > 0 and rng[pos]-1 == rng[pos-1]) or (pos < len(rng) -1 and rng[pos]+1 == rng[pos+1]):
            print("con", rng[pos])
        con(rng, pos+1)

con(num)

edit: this is solution is based on concurrent function, and needs only the list as argument. As long as they are within lower-/upperbound of list, the function will check if (previous number)-1 or (next number)+1 are equal (this number) output will be: con 8 con 9 con 1 con 2 con 3

答案 4 :(得分:0)

You can use the function groupby():

from itertools import groupby
from operator import sub, itemgetter

num = [8, 9, 4, 1, 2, 3]

iget = itemgetter(1)
gb = groupby(enumerate(num), key=lambda x: sub(*x))
all_groups = (list(map(iget, g)) for _, g in gb)
list(filter(lambda x: len(x) > 1, all_groups))
# [[8, 9], [1, 2, 3]]