我如何转换它:
(1, 315.0, 2, 30.399999618530273, 3, 1.1033999919891357, 4, 8.0)
进入这个:
((1, 315.0), (2, 30.399999618530273), (3, 1.1033999919891357), (4, 8.0))
是否有一种简单的方法可以在不循环的情况下完成?
答案 0 :(得分:16)
>>> x = (1, 315.0, 2, 30.399999618530273, 3, 1.1033999919891357, 4, 8.0)
>>> tuple(zip(x[::2], x[1::2]))
((1, 315.0), (2, 30.399999618530273), (3, 1.1033999919891357), (4, 8.0))
答案 1 :(得分:10)
t = (1, 315.0, 2, 30.399999618530273, 3, 1.1033999919891357, 4, 8.0)
print tuple(zip(*[iter(t)] * 2))
编辑:为了使其更具可读性,它应该封装在grouper()
recipes中的itertools
函数之类的函数中:
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
答案 2 :(得分:4)
我会选择发电机:
def pairs( tup ):
t = iter(tup)
while True: yield t.next(), t.next()
a = (1, 315.0, 2, 30.399999618530273, 3, 1.1033999919891357, 4, 8.0)
for p in pairs(a): print p
因为它更冗长,可能更快(实际上没有分配配对列表)。
修改强>
阅读解决方案的时间要短得多:
t = iter(a)
print zip(t, t)