web-dev-qa-db-ja.com

2つのリストを持つネストされたリストの理解

単純なリストの理解がどのように機能するかを理解しています。例:

[x*2 for x in range(5)] # returns [0,2,4,6,8]

また、ネストされたリストの圧縮がどのように機能するかを理解しています:

w_list = ["i_have_a_doubt", "with_the","nested_lists_comprehensions"]

# returns the list of strings without underscore and capitalized
print [replaced.title() for replaced in [el.replace("_"," ")for el in w_list]]

だから、私がこれをやろうとしたとき

l1 = [100,200,300]
l2 = [0,1,2]
[x + y for x in l2 for y in l1 ]

私はこれを期待していました:

[101,202,303]

しかし、私はこれを得た:

[100,200,300,101,201,301,102,202,302]

だから私は問題を解決するより良い方法を得た、それは私に欲しいものを与えた

[x + y for x,y in Zip(l1,l2)]

しかし、最初のコードで9つの要素が返されることを理解していませんでした

32
André Caldas

9つの数字があるのは、pythonが扱うため

[x + y for x in l2 for y in l1 ]

同様に

for x in l2:
    for y in l1:
       x + y

つまり、ネストされたループです

50
rspencer

リスト内包表記はforループと同等です。したがって、_[x + y for x in l2 for y in l1 ]_は次のようになります。

_new_list = []
for x in l2:
    for y in l1:
        new_list.append(x + y)
_

一方、Zipは、各リストから1つの要素を含むタプルを返します。したがって、[x + y for x,y in Zip(l1,l2)]は次と同等です。

_new_list = []
assert len(l1) == len(l2)
for index in xrange(len(l1)):
    new_list.append(l1[index] + l2[index])
_
17
Wesley Baugh

上記の答えはあなたの質問には十分ですが、参考のためにリスト理解ソリューションを提供したかったです(それがあなたの初期コードであり、あなたが理解しようとしているものを見てください)。

両方のリストの長さが同じであると仮定すると、次のことができます。

[l1[i] + l2[i] for i in range(0, len(l1))]
10
Sticky
[x + y for x in l2 for y in l1 ]

と同等です:

lis = []
for x in l:
   for y in l1:
      lis.append(x+y)

したがって、lのすべての要素に対して、lには3つの要素があり、l2には要素があるので、合計ループは9(len(l)*len(l1))に等しいので、l1を繰り返します。

3

このシーケンス

res = [x + y for x in l2 for y in l1 ]

に等しい

res =[]
for x in l2:
    for y in l1:
        res.append(x+y)
1
oleg