2016-04-04 8 views
1

私はこのようなコードの行がありますリスト内包をforループとして書き直す方法はありますか?

list1=[string1[i:i+int1] for i in range(0, len(string1), int1)] 

が、私はそう 「の」がある場合、我々は新しい行を開始すべきであると言って私の先生を覚えているし、のように見えるこのコードを書くための方法があります:

for i in range(0, len(string1), int1): 
    #something here 

などですか?

+8

[リストの補完](https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions)をお読みください。 – Lafexlos

+8

先生のアドバイスは過度の単純化です。 for _statement_があるときに新しい行を始めるべきですが、式の中の 'for'はfor文の一部ではありません。それはリストの理解の一部です。 – Kevin

+3

あなたの教師が、明示的に 'for'を優先して[list comprehensions](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions)を忘れるべきではないということはほとんど確信していますリストを細かく構築するループ。彼らがした場合、彼らは実際にPythonを教えていません。 – ShadowRanger

答えて

5

あなたはlist-comprehensionからfor loop定期的な退屈な古いものを抽出するために意味ですか?

list1=[string1[i:i+int1] for i in range(0, len(string1), int1)] 

次のようになります。

list1 = list() 
for i in range(0, len(string1), int1): 
    list1.append(string1[i:i+int1]) 

あなたがあなたのデータを反復しながら、例外処理、ロギング、またはより複雑な機能や動作を追加したい場合、これは有用であろう。例えば

list1 = list() 
for i in range(0, len(string1), int1): 
    log.info('in loop: i={}'.format(i)) 
    try: 
     data = string1[i:i+int1] 
    except: 
     log.error('oh no!') 
     # maybe do something complex here to get some data anyway? 
     data = complex_function(i) 
    log.debug('appending to list: data={}'.format(data)) 
    list1.append(data) 

しかし、一般的リスト・理解を話すことはそれを書くために、完全に合法的な方法です。

+0

代わりに、関数を記述し、 '[valの値には何らかの関数(val)]を実行することができます。それが当然の場合には適切であると仮定します。他の潜在的に適切な選択肢として、リストを返すのではなく、データを取得してジェネレータを取引から取り除くことができます。 –

+4

'[]'は 'list()'よりも効率的です。 [理由](https://stackoverflow.com/questions/30216000/why-is-faster-than-list/30216156#30216156) – zondo

+4

を参照してください。@ zondo:人々の名前シャドーイングの問題を便利に回避します。理想的には、彼らは最初にそれをしませんでした。つまり、 '[] 'に対する' list() 'の増分コストはかなり小さく、私のマシンでは約60-70余分になります(' []の基本コストに対して2-3.5倍の増加があります) '〜20-30 nsですが、最もホットなループ以外のすべてでは問題になることはありません)。 – ShadowRanger

3

最初に空のリストを作成して、各反復ごとに追加する必要があります。

list1 = [] 
for i in range(0, len(string1), int1): 
    list1.append(string1[i:i+int1]) 
1

リストの内包が翻訳ということに:

l = [] 
for i in range(0, len(string1), int1): 
    l.append(string1[i:i+int1]) 
0

汚いリトルビットが、固定サイズのサブコレクションに分割収集のための良い代替。

from itertools import zip_longest 

l = [] 
for chunk in zip_longest(*([iter(string1)]*int1), fillvalue=''): 
    l.append(''.join(chunk)) 
0
g = (string[i:i+int1] for i,char in enumerate(string) if i % int1 == 0) 
l = list(g) 

は、インデックスを扱うしばらくlen(iterable)を使用しないでください。それにはenumerate()を使用してください。それは(index, item)を生じる。これは効率的でpythonです。

forループを使用して改行を行うべきであるという考え方は、おそらく他の言語のC、C++には慣用的です。しかし、Pythonではありません。リストの解説は、FPのハスケルの世界に来ています。彼らが来るとエレガントになります。

関連する問題