0

(a,b), (c,d), (e,f), (g,h) => (b, c), (d, e), (f, g)

そのため、最初と最後を省略し、逆のセグメントを処理します

私はこれで 3 回目にヒットし、常に独自のコードを記述します...

4

2 に答える 2

0

あなたはこれを行うことができます:

>>> 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 は絶食ですが、桁違いではありません。

于 2013-09-02T15:38:54.253 に答える