67

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

[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 ]

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

[100,201,302]

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

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

だから私は問題を解決するより良い方法を手に入れました。それは私が望むものを与えてくれました

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

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

4

5 に答える 5

29

リスト内包表記は 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])
于 2013-05-15T14:45:31.230 に答える
2

このシーケンス

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

と同等です

res =[]
for x in l2:
    for y in l1:
        res.append(x+y)
于 2013-05-15T14:47:41.643 に答える