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)
我在这里缺少什么?
您的列表理解正在执行嵌套循环,而不是并行循环。它在两个切片的叉积上循环。你可以看到这一点,如果你删除if和返回的值x和y自己。
>>> [(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)
如果你想在列表中同时返回True和False,你不应该使用if,你应该返回测试的结果:
>>> [(x + 1 == y) for x, y in zip(lst[:-1], lst[1:])]
[True, True, True, False]
Run Code Online (Sandbox Code Playgroud)