我正在尝试从未排序的列表中查找连续的值。实验代码如下:
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循环部分并获得整个序列?非常感谢。
答案 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]]