2014-05-09 3 views
0

Je donne les résultats suivants x et je veux saisir l'index où un élément == 0, tels que l'indice 2 dans le ci-dessous:Placer une boucle for dans la carte?

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

Je sais comment résoudre cela avec un forloop, mais je suis Je me demande si je peux utiliser la carte pour faire la même chose.

Cela ne fonctionne pas:

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

Pour la solution de boucle:

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

Veuillez spécifier si vous utilisez Python 2 ou Python 3. La réponse peut différer. – Matthew

Répondre

1

map() est probablement pas la bonne approche parce que vous finirez avec une liste qui est la même longueur que votre original. Donc, dans ce cas, le mieux que vous pouvez faire avec map() est de le renvoyer [False, False, True, False].

filter() pourrait être plus approprié, mais si vous êtes à la recherche d'une solution d'une ligne d'une compréhension de la liste est sans doute la voie à suivre:

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] 

Voici à quoi il ressemblerait avec filter():

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

Notez que sur Python 3.x filter() retourne un générateur au lieu d'une liste, donc si vous voulez que le résultat soit une liste que vous voudriez zero = list(filter(...)).

0

Vous pouvez utiliser la méthode du filtre python beaucoup plus propre:

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

filter(lambda x: '0' in x, my_list)[0] retour le premier élément contenant 0 my_list.index(<item>) renvoie l'index de cet élément

0

Au lieu de map, vous devez utiliser filter.

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

Cependant, le filtre n'est pas considéré comme pythonique. Serait une plus nette compréhension de la liste

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

Vous pouvez également supprimer la variable d'index en utilisant énumèrent.

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

'pas pythonique', puis une ligne plus tard, itérant par index. 'filter()' est généralement moins lisible qu'un comp de liste, mais itérer par index n'est * jamais * la bonne solution en Python - beaucoup plus impythonique. –

+0

Vous avez raison, monsieur. –