我有一个列表:
L = [1,2,3,4,5,6,7,8]
我要遍历列表中的连续元素,以便在最后一个元素为 8 时将其与第一个元素 1 配对。
我想要的最终输出是:
[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,1]
我尝试过使用这种方式:
for first,second in zip(L, L[1:]):
print([first,second])
但是我只得到以下结果:
[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8]
如何将first与first配对?我听说过列表的负索引属性。
答案 0 :(得分:13)
您可以简单地将zip()
中的第二个列表扩展为仅包含第一项的列表,例如:
for first, second in zip(L, L[1:] + L[0:1]): # or simply zip(L, L[1:] + L[:1])
print([first, second])
答案 1 :(得分:6)
您可以使用cycle
循环列表(与islice
组合使用以跳过第一个元素):
/** @test */
public function it_saves_the_data_in_database()
{
$this->get(route('connect.index', [
'scope' => $this->scope,
'code' => $this->code,
'state' => csrf_token(), //it's null here...
]))->assertStatus(200); //however it returns 419
}
这很容易扩展。请注意,它依赖于from itertools import cycle, islice
L = [1,2,3,4,5,6,7,8]
rest_L_cycled = islice(cycle(L), 1, None)
items = zip(L, rest_L_cycled)
print(list(items))
在较短列表上停止的事实(第二个参数是一个无限循环)。它还懒惰地做所有事情,并且不创建任何中间列表(嗯,除了zip
ed列表之外):-)
答案 2 :(得分:4)
您还可以遍历L
的索引,对于输出元组第二项的索引,只需使用L
长度的其余部分即可:
[(L[i], L[(i + 1) % len(L)]) for i in range(len(L))]
答案 3 :(得分:3)
您可以简单地将zip(L,L [1:])产生的列表与最后一个元素L [-1]和第一个元素L [0]形成的对连接起来,并遍历结果
for first,second in zip(L, L[1:]) + [(L[-1],L[0])]:
print ([first,second])
它给出了预期的结果。
答案 4 :(得分:2)
它不是单线的,而是:
>>> L = [1,2,3,4,5,6,7,8]
>>> z = list(zip(L[:-1], L[1:]))
>>> z.append((L[-1], L[0]))
>>> z
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 1)]
答案 5 :(得分:2)
这是(过度)使用itertools
的版本:
from itertools import islice, cycle
L = [1,2,3,4,5,6,7,8]
for a, b in zip(L, islice(cycle(L), 1, None)):
print(a, b)
这个想法是在第二个参数上cycle
-zip
一直运行到L
本身用完为止。这不会创建任何新列表。
答案 6 :(得分:2)
您只需将前面的元素附加到后面。
for first,second in zip(L, L[1:] + L[:1]):
print([first,second])
答案 7 :(得分:2)
for i in range(len(L)):
first = L[i]
second = L[(i+1) % len(L)]
答案 8 :(得分:2)
您可以简单地将itertools.zip_longest
与第一项的fillvalue
一起使用。
from itertools import zip_longest
list(map(tuple, zip_longest(L, L[1:], fillvalue=L[0]))