2016-05-24 37 views
2

例子:地圖 - 轉換爲嵌套循環映射相當於

>>>for x in iterable1: 
... expression 

地圖的形式是:

>>>map(lambda x:expression,iterable1) 

如何擴展這個嵌套的呢?

實施例:

>>>for x in itr1: 
... for y in itr2: 
...  expr 

不使用推導。

編輯:僅使用地圖。

+1

,正如待用;試試這個'l = [234,124,142]; list(map(lambda x:sum(map(int,x)),map(str,l)))':) –

+0

@BhargavRao明白了。感謝提示。 – lapin

回答

1

在這一個承擔我。不是一個解釋,但2天后這工作。只使用地圖和列表。這是糟糕的代碼。歡迎提出縮短代碼的建議。 Python 3的溶液

實施例使用列表理解:僅使用地圖

>>>a=[] 
>>>for x in [0,1,2]: 
... for y in [100,200,300]: 
...  a.append(x+y) 
... 
>>>a 
[100,200,300,101,201,301,102,202,302] 

現在例如:使用用於

>>> a=[x+y for x in [0,1,2] for y in [100,200,300]] 
>>> a 
[100,200,300,101,201,301,102,202,302] 

>>>n=[] 
>>>list(map(lambda x:n.extend(map(x,[100,200,300])),map(lambda x:lambda y:x+y,[0,1,2]))) 
>>>n 
[100,200,300,101,201,301,102,202,302] 

小得多python2.7溶液:

>>>m=[] 
>>>map(lambda x:m.extend(x),map(lambda x:map(x,[100,200,300]),map(lambda x:lambda y:x+y,[0,1,2]))) 
>>>m 
[100,200,300,101,201,301,102,202,302] 

另一種變化:我通過電子郵件發送給Mark Lutz,這是他的解決方案。這不使用閉包,並且最接近於嵌套for循環功能。

>>> X = [0, 1, 2]    
>>> Y = [100, 200, 300] 
>>> n = [] 
>>> t = list(map(lambda x: list(map(lambda y: n.append(x + y), Y)),X)) 
>>> n 
[100,200,300,101,201,301,102,202,302] 
0

你不能。 lambda僅限於返回值可封裝爲單個表達式的函數:語句不允許。

你應該問自己的一個問題是爲什麼你認爲這將是編寫Python程序的理想方式?爲了可讀性,語言已被明確定義,並且您應該盡一切可能來保持可讀性。

2

你可以使用itertools.product建立自己的兩個嵌套序列的笛卡兒積,和map你表達的2元組的該列表:

from itertools import product 

map(lambda (x, y): expression, product(itr1, itr2)) 

例一些實際值:

seq = map(lambda (x, y): '%s:%s' % (x, y), product(itr1, itr2)) 
for item in seq: 
    print item 

請注意,需要lambda (x, y)來將每個2元組從序列解壓到表達式中使用的單獨的xy參數。

+0

這可行,但不是我想到的,並且您只需使用lambda(表達式語句)中的print來消除seq。我在「Mark Lutz學習Python」一書中讀到,「最後一個例子的地圖和過濾器相當複雜,並且深深嵌套,所以我甚至不會在這裏展示它。 – lapin

+0

你不能在表達式中使用語句。 'print'僅用於演示目的。話雖如此,這仍然解決你的問題,除非你問*只使用'map' * - 那麼答案是「你不能」。 –

+0

除了使用列表,我想我只使用地圖。該列表適用於迭代協議。 @Lukas Graf – lapin

0

Thinks lapin!

我有同樣的問題,你給我解德:

朗方式:

SUITE = 'Heart Diamonds Spades Clubs'.split() 
RANKS = '2 3 4 5 6 7 8 9 10 J Q K A'.split() 

for x in RANKS: 
    for y in SUITE: 
     deck.append(x+" " +y) 
print(deck) 
print(len(deck)) 

短道和SOLUTION

deck = [x +" " + y for x in RANKS for y in SUITE] 
+1

這似乎並沒有解決OP問的問題。你只是分享自己的問題的答案? – Antimony