给出一个列表L = [('a',3),('b',4),('c',14),('d',10)]
,
所需的输出是来自元组的第一项和来自下一元组的第二项,例如:
a 4
b 14
c 10
直截了当但却是单声道的方式
for i in range(len(L)-1):
print(L[i][0], L[i+1][1])
或者,这就是我提出的:
for (a0,a1),(b0,b1) in zip(L,L[1:]):
print(a0,b1)
但似乎很浪费。有没有标准的方法来做到这一点?
答案 0 :(得分:2)
我个人认为两种选择都很好可以提取项目并加入它们:
pairs = zip(map(itemgetter(0), L), map(itemgetter(1), L[1:]))
# [('a', 4), ('b', 14), ('c', 10)]
答案 1 :(得分:2)
pythonic方法是使用生成器表达式。
你可以这样写:
for newTuple in ((L[i][0], L[i+1][1]) for i in range(len(L)-1)):
print(newTuple)
它看起来像列表解析,但是迭代器生成器不会创建完整列表,只是通过元组产生一个元组,所以它没有为列表的完整副本占用额外的内存。
答案 2 :(得分:1)
要改进zip
示例(已经很好),您可以使用itertools.islice
来避免创建初始列表的切片副本。在python 3中,下面的代码只生成值,在此过程中不会创建临时列表。
import itertools
L = [('a',3),('b',4),('c',14),('d',10)]
for (a0,_),(_,b1) in zip(L,itertools.islice(L,1,None)):
print(a0,b1)
答案 3 :(得分:0)
我在两个生成器表达式的帮助下拆分了第一个和第二个项目,使用islice删除一个项目并再次将两个流程压缩在一起。
first_items = (a for a, _ in L)
second_items = (b for _, b in L)
result = zip(first_items, islice(second_items, 1, None))
print(list(result))
# [('a', 4), ('b', 14), ('c', 10)]