python 3.6错误或者我疯了

roo*_*oot 0 python list-comprehension list python-3.x

检查列表中的项目是否连续。

[True for x in lst[:-1] for y in lst[1:] if x + 1 == y]
Run Code Online (Sandbox Code Playgroud)

所以列表[1, 2, 3, 4, 5] 返回[True, True, True, True]意味着列表是连续的。

list[1,2,3,4,4] 返回[True, True, True, True]意味着 list 是连续的,但事实并非如此。

为每个语句做证明

lst = [1,2,3,4,4]


def consecutive(lst):    
    lst.sort()
    return [True for x in lst[:-1] for y in lst[1:] if x + 1 == y]


print(consecutive(lst))

some_list = []
for i,j in zip(lst[:-1], lst[1:]):
    if i+1 == j:
        some_list.append(True)
    else:
        some_list.append(False)

print(some_list)
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

Bar*_*mar 7

您的列表理解正在执行嵌套循环,而不是并行循环。它在两个切片的叉积上循环。你可以看到这一点,如果你删除if和返回的值xy自己。

>>> [(x, y) for x in lst[:-1] for y in lst[1:]]
[(1, 2), (1, 3), (1, 4), (1, 4), (2, 2), (2, 3), (2, 4), (2, 4), (3, 2), (3, 3), (3, 4), (3, 4), (4, 2), (4, 3), (4, 4), (4, 4)]
Run Code Online (Sandbox Code Playgroud)

True每当配对元素是连续的时,结果就包含;当它们不连续时,它不会向结果添加任何内容。有 4 对是连续的,所以这就是你在结果中得到的。

如果只想测试相邻元素,请zip()在理解中使用:

>>> [True for x, y in zip(lst[:-1], lst[1:]) if x + 1 == y]
[True, True, True]
Run Code Online (Sandbox Code Playgroud)

如果你想在列表中同时返回TrueFalse,你不应该使用if,你应该返回测试的结果:

>>> [(x + 1 == y) for x, y in zip(lst[:-1], lst[1:])]
[True, True, True, False]
Run Code Online (Sandbox Code Playgroud)