2017-06-11 3 views
1

Pythonリストのすべての値をループする方法はありますか?例えば特定のインデックスから始まるすべてのPythonリスト値を反復する

li = ['a', 'b', 'c', 'd'] 

スタートがインデックス1でループして、結果をプリントアウト。私の予想される出力は次のようになります。私は仕事をすることができ、「forループ」2を使用して知っているが、これを行うに任意のより良い方法はあり

['b', 'c', 'd', 'a'] 

+0

リストはどれくらい大きいですか? – Marat

答えて

0

組み込み関数を使用することが推奨されますが、このように自分で行うこともできます。

li = ['a', 'b', 'c', 'd'] 
i_offset = 1 
for i in range(len(li)): 
    print (li[(i+i_offset) % len(li)]) 

は、あなたの質問を約(より神託のように)リストを印刷答えるために:

(単純なインデックス操作で)を反復あなたの質問に答えるために:

li = ['a', 'b', 'c', 'd'] 
i_offset = 1 
print ([li[(i+i_offset) % len(li)] for i,x in enumerate(li)]) 

キューに変換し、それを達成するためにリストに戻す必要はありません。

+0

問題を解決するのにデューク(deque)は必要ではないが、組み込み(誰もがそれにアクセスできるように)であり、回転をネイティブにサポートしているというのは正しい。したがって、使用する必要がないにもかかわらず、コードがより簡単に(おそらく)高速になります。それを元に戻すことは完全にオプションであることに注意してください(私の答えではっきりしない場合は明確にすることができます)、 'deque'自体は繰り返しになるとリストのようなものです。私はあなたの答えを編集してうれしく思います。実際に問題を解決しました。 :) – MSeifert

+0

また、質問にはpython-3.xタグが付いているので、おそらく括弧( '()')を 'print'sに追加するべきです。 – MSeifert

+0

あなたの入力用の@MSeifertをありがとう、私は私の答えを編集しました。あなたの答えは本当に面白いので、Pythonの優れた機能を示しています。組み込み関数を使いやすくするためには良いアプローチです。 Pythonのdocは 'deque'がすべての要素を新しいオブジェクトに追加すると述べて以来、もっと速いとは思えません。あなたは私の第一の答えについて正しいです、私は夜遅くそうすべきではありません:) – RaphaMex

3

あなたはスライスでこれを行うことができ、次のいずれかニシキヘビ> = 3.5のために働く

l2 = [*li[1:], *li[:1]] 
for i in l2: 
    print(i) 

を。それ以前のバージョンの場合は、li[1:] + li[:1]またはchain(li[1:],li[:1])chainからitertoolsを使用できます。また

、あなたができるitertoolsモジュールから他の二つのヘルパーを使用して:余分なリストを作成しません

# call list on it if you need a list object 
it = islice(cycle(li), 1, len(li)+1)  
for i in it: 
    print(i) 

>>> from collections import deque 

>>> li = deque(['a', 'b', 'c', 'd']) 
>>> li.rotate(-1) 
>>> li 
deque(['b', 'c', 'd', 'a']) 

は、念のためにあなたが本当に結果としてリストが欲しいあなたはいつも戻って、再びそれを変換することができます:

+0

:print(i)はPythonの任意のバージョンで動作し、最も簡単な方法はIMOです。 – Hami

1

独自のジェネレータ関数looperを定義し、それによって返されるジェネレータをループすることができます。ジェネレータ関数は、第1引数としてリストをとり、第2入力として所望の開始インデックスを取る。モジュロ演算子(%)は、リストの境界内でインデックスを保持するための手口を行います。

def looper(my_list, starting_ix): 
    len_ml = len(my_list) 
    for i in range(starting_ix, len_ml + starting_ix): 
     yield my_list[i % len_ml] 

li = ['a', 'b', 'c', 'd'] 

for item in looper(li, 1): 
    print item 
1

追加リストの後にリストし、start_indexからstart_index+len(list)までを繰り返します。

ary = [1,2,3,4,5] 
start_idx = 3 
for num in (ary+ary)[start_idx:start_idx+len(ary)]: 
    print(num) 
+0

'start_idx + len(ary)'の後に ']'を閉じるのを忘れてしまった。また、「リストの後にリストを追加する」は、「連結」とも呼ばれます(明確化の意味 - 誰もがあなたの意図を知っていると思います)。 :) – MSeifert

+0

私の答えは入力ミスです。 私は英語が上手ではありません。ご理解いただきたいと思います。 – Maybe

+0

あなたはそれを間違った場所に挿入しました: '[start_idx:start_idx + len(ary)]'(最後の2文字の異なる順序に注意してください)。 :) – MSeifert

関連する問題