(a,b), (c,d), (e,f), (g,h) => (b, c), (d, e), (f, g)
そのため、最初と最後を省略し、逆のセグメントを処理します
私はこれで 3 回目にヒットし、常に独自のコードを記述します...
(a,b), (c,d), (e,f), (g,h) => (b, c), (d, e), (f, g)
そのため、最初と最後を省略し、逆のセグメントを処理します
私はこれで 3 回目にヒットし、常に独自のコードを記述します...
あなたはこれを行うことができます:
>>> tups=[('a','b'), ('c','d'), ('e','f'), ('g','h')]
>>> zip(*[iter([e for t in tups for e in t][1:-1])]*2)
[('b', 'c'), ('d', 'e'), ('f', 'g')]
私が投稿したコードは、itertools または KennyTM のソリューションを使用するよりも「桁違いに遅い」というわけではありません。
from __future__ import print_function
import itertools
from collections import defaultdict
li=[('a','b'), ('c','d'), ('e','f'), ('g','h')]
def t1(tups):
return zip(*[iter([e for t in tups for e in t][1:-1])]*2)
def t2(tups):
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
flat=itertools.chain.from_iterable(tups)
sl=itertools.islice(flat,1,len(tups)*2-1)
return list(grouper(sl,2))
def t3(pairs):
it = iter(pairs)
(_, p) = next(it)
for (n, p2) in it:
yield (p, n)
p = p2
if __name__ == '__main__':
import timeit
n=1000000
print(t1(li),t2(li), list(t3(li)))
assert t1(li)==t2(li)==list(t3(li))
print(timeit.timeit("t1(li)", setup="from __main__ import t1, li",number=n))
print(timeit.timeit("t2(li)", setup="from __main__ import t2, li, itertools",number=n))
print(timeit.timeit("list(t3(li))", setup="from __main__ import t3, li",number=n))
版画:
3.02761888504
4.29241204262
2.12067294121
これは、それらがすべてほぼ同じ速度であることを示しています。KennyTM は絶食ですが、桁違いではありません。