5

次の例のリストを使用します。L = ['a','b','c','d']

次の出力を実現したいと思います。

>>> a d b
>>> b a c
>>> c b d
>>> d c a

擬似コードは次のようになります。

for e in L:
    print(e, letter_before_e, letter_after_e
4

5 に答える 5

7

ループしてL、インデックスのiマイナスとプラス1のモジュロlen(L)を取り、前の要素と次の要素を取得することができます。

于 2012-08-17T17:59:06.953 に答える
6

あなたはほとんどそこにいます

for i, e in enumerate(L):
    print(e, L[i-1], L[(i+1) % len(L)])

modを追加するために編集

于 2012-08-17T18:02:35.087 に答える
1

この場合はおそらくやり過ぎでしょうが、これは循環二重リンクリストの一般的な使用例ですhttp://ada.rg16.asn-wien.ac.at/~python/how2think/english/chap17.htm

于 2012-08-17T18:00:54.567 に答える
0

私のコードでは、リストの前に最後の要素が追加され、最初の要素が追加された3つの要素の移動ウィンドウを使用します。

from itertools import tee, izip, chain

def window(iterable,n):
    '''Moving window
    window([1,2,3,4,5],3) -> (1,2,3), (2,3,4), (3,4,5)
    '''
    els = tee(iterable,n)
    for i,el in enumerate(els):
        for _ in range(i):
            next(el, None)
    return izip(*els)


def chunked(L):
    it = chain(L[-1:], L, L[:1]) # (1,2,3,4,5) -> (5,1,2,3,4,5,1)
    for a1,a2,a3 in window(it,3): # (3,1,2,3,1) -> (3,1,2), (1,2,3), (2,3,1)
        yield (a2,a1,a3)


## Usage example ##
L = ['a','b','c','d']

for t in chunked(L):
    print(' '.join(t))
于 2012-08-17T18:28:48.823 に答える
0

多くの場合、先を見越すよりも、すでに見たアイテムを追跡する方が概念的に簡単です。このクラスは、最大長を設定できるためdeque、前のアイテムを追跡するのに理想的です。n新しいアイテムを追加すると、古いアイテムが自動的に削除されます。

from collections import deque

l = ['a','b','c','d']
d = deque(l[-2:], maxlen=3)

for e in l:
    d.append(e)
    print d[1], d[0], d[2]

このソリューションの唯一の違いはd c a、最後ではなく最初に来ることです。それが重要な場合は、すでに1回の反復を見たかのように始めることができます。

from collections import deque

l = ['a','b','c','d']
d = deque(l[-1:] + l[:1], maxlen=3)

for e in l[1:] + l[:1]:
    d.append(e)
    print d[1], d[0], d[2]
于 2012-08-17T18:34:01.363 に答える