迭代Python列表中的连续元素,以使最后一个元素与第一个元素结合

时间:2018-08-22 12:25:21

标签: python

我有一个列表:

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配对?我听说过列表的负索引属性。

9 个答案:

答案 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]))