从python中的列表中压缩三元组中的项目

时间:2017-03-08 09:21:17

标签: python list

我有一个带有值的列表A

[43.4543, 23.45343, 76.55665, 33.4345, 5]

我需要按以下方式压缩它,

[(43.4543,23.45343,5),(76.55665,33.4345,5)]

有人可以指导我解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

zip将返回一个列表,其长度等于最短输入序列的长度。由于最后一个(A[-1:])只有1个元素,因此不能使用zip。尝试下面不同的东西。

a = [43.4543, 23.45343, 76.55665, 33.4345, 5]
map(lambda x: x + (a[-1],), zip(a[::2], a[1::2]))

答案 1 :(得分:2)

您可以zip使用itertools.repeat

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<a href="#scrolltohere" id="bike">Bikes</a>



<div class="eshop-section section" id="scrolltohere">
  <h2 style="font-family: 'Lato'; font-size: 40px;">
    &nbsp &nbsp &nbsp&nbsp &nbspBikes
  </h2>
</div>

答案 2 :(得分:1)

我不确定你为什么要在这里使用zip。对于给定的数据,您可以像这样组装所需的输出:

p = [a[:2] + a[-1:], a[2:]]

或者如果列表项必须是元组:

p = [tuple(u) for u in (a[:2] + a[-1:], a[2:])]

但您可以使用zipitertools.cycle

来完成此操作
from itertools import cycle

a = [43.4543, 23.45343, 76.55665, 33.4345, 5]
p = zip(a[::2], a[1::2], cycle(a[-1:]))
print(list(p))

<强>输出

[(43.4543, 23.45343, 5), (76.55665, 33.4345, 5)]

这适用于奇数长度的任何a

而不是使用itertools.cycle,您可以使用itertools.repeat,就像在niemmi的回答中一样。

另一种选择是使用源列表的迭代器进行压缩:

from itertools import repeat

a = range(11)
head, tail = iter(a), a[-1]

p = zip(head, head, repeat(tail))
print(list(p))

<强>输出

[(0, 1, 10), (2, 3, 10), (4, 5, 10), (6, 7, 10), (8, 9, 10)]

答案 3 :(得分:0)

P = zip(A[::2], A[1::2], A[-1:]*2)应该给出预期的输出