4

わかりましたので、複数の "for" を使って Python のリスト内包表記を書くのは本当に苦手ですが、もっと上手になりたいと思っています。ラインかどうかを確実に知りたい

>>> [S[j]+str(i) for i in range(1,11) for j in range(3) for S in "ABCD"]

次のようなものを返すように修正できます["A1","B1","C1","D1","A2","B2","C2","D2"...(etc.)]

そうでない場合は、同じリスト、つまり「ABCD」と1から10までの数字のすべての組み合わせの文字列のリストを返すことができるリスト内包表記があれば。

4

5 に答える 5

1

iterable のすべての要素を別の iterable のすべての要素と組み合わせることを考えるたびに、 itertools.product を考えてください。これは、2 つのセット (またはリスト) のデカルト積です。

これまでにここで提示されたものよりもわずかに高速なソリューションを見つけました。@daniel ソリューションよりも 2 倍以上高速です (ただし、彼のソリューションははるかにエレガントに見えます)。

import itertools
[x + y for (x,y) in (itertools.product('ABCD', map(str,range(1,5))))]

ここでの違いは、マップを使用して int を文字列にキャストしたことです。通常、ベクトルに関数を適用する方が、個々の項目に適用するよりも高速です。

複雑な理解を扱うときの一般的なヒント:

内包表記の中に for や条件文がたくさんある場合は、次のように複数の行に分割します。

[S[j]+str(i) for i in range(1,11)
             for j in range(3) 
             for S in "ABCD"]

この場合、読みやすさの変化はそれほど大きくありませんでしたが、条件文と for がたくさんあると、大きな違いが生じます。これは for ループと入れ子になった if ステートメントを書くのとまったく同じですが、":" と ID はありません。

通常の fors を使用したコードを参照してください。

ans = []
for i in range(1,11):
    for j in range(3): 
        for S in "ABCD": 
            ans.append(S[j] + str(i))

ほぼ同じです:)

于 2013-11-08T14:18:04.303 に答える