2014-05-09 104 views
0

我有以下的X和我想抓住的索引,其中一個項目== 0,如指數2以下:在地圖內放置for循環?

[['UNITED STATES', 'OHIO, USA'], 
['NEW YORK, USA', 'UNITED STATES'], 
['LYON, FRANCE', 'FRANCE', '0'] 
['FRANCE']] 

我知道如何與一個for循環解決這個問題,但我想知道我是否可以使用地圖來做同樣的事情。

這不起作用:

map(lambda y: i==0 for i in y, x) 

對於循環解決方案:

zero = [] 
for i, val in enumerate(x): 
    for y, yval in enumerate(val): 
     if yval == '0': 
      zero.append(i) 
+0

請指定您使用的是Python 2還是Python 3.答案可能會有所不同。 – Matthew

回答

1

map()可能是不正確的做法,因爲你最終會與相同長度的列表你的原創。所以在這種情況下,您可以用map()做的最好的事情是讓它返回[False, False, True, False]

filter()可能更合適,但如果你只是尋找一個在線解決方案列表理解可能是要走的路:

x = [['UNITED STATES', 'OHIO, USA'], 
    ['NEW YORK, USA', 'UNITED STATES'], 
    ['LYON, FRANCE', 'FRANCE', '0'], 
    ['FRANCE']] 
zero = [i for i, row in enumerate(x) if '0' in row] 

這裏是它會如何看待與filter()

zero = filter(lambda i: '0' in x[i], range(len(x))) 

請注意,在Python 3.x filter()返回一個生成器,而不是一個列表,所以如果你想結果是一個列表,你會想要zero = list(filter(...))

0

您可以使用Python濾波方法更清潔:

my_list.index(filter(lambda x: '0' in x, my_list)[0]) 

filter(lambda x: '0' in x, my_list)[0]返回包含0 my_list.index(<item>)返回該項目

0

代替map指數的第一個項目,你應該使用filter

filter(lambda i: '0' in data[i], range(len(data)) 

但是,過濾器不被認爲是pythonic。更清晰將是一個列表理解

[i for i in range(len(data)) if '0' in data[i]] 

您還可以通過使用枚舉刪除索引變量。

[i for i, row in enumerate(data) if '0' in row] 
+0

'不pythonic',然後一行後,通過索引迭代。 'filter()'通常不如列表的可讀性,但通過索引進行迭代*永遠不會是Python的正確解決方案 - 更加和諧。 –

+0

你說得對,先生。 –