2012-01-10 6 views
0

J'utilise Python et je voudrais vérifier l'emplacement d'une valeur dans une liste de listes par rapport à d'autres index.Python: Vérifier un index par rapport à plusieurs autres index

Comme si j'avais 1 à (1, 1) je voudrais être en mesure de vérifier si 1 était sur les autres index afin que je puisse faire quelque chose en fonction de l'index correspondant.

Par exemple:

list_of_lists = [ 
    [4, 5, 6], 
    [7, 1, 8], 
    [6, 2, 9] 
    ] 
if 1 in row for row in list_of_lists: 
    if index of 1 is (0, 0), (0, 1), or (0, 2) 
     print ("It is in the First row!") 
    if index of 1 is (1, 0), (1, 1), or (1, 2) 
     print ("It is in the second row!") 

Si cela a fonctionné correctement, il doit imprimer: « Il est dans la deuxième rangée! » Parce que l'index de 1 correspond à l'un des indices de la troisième instruction if. Ce ne sont pas nécessairement des lignes dans certains cas où je l'utiliserais. Donc, si vous pouviez fournir un moyen qui n'utiliserait pas les lignes dans votre réponse. Juste un moyen de regarder les index et de les comparer. Évidemment, ce n'est pas la syntaxe correcte. Mais comment ferais-je cela en Python? Comment pourrais-je obtenir l'indice de 1 et le comparer à d'autres index dans une liste de listes?

Merci!

+0

Je pense que cette question serait beaucoup plus claire si vous l'expliquiez en termes de fonction. Par exemple, voulez-vous une fonction qui vous permettrait de faire: 'list_index (list_of_lists, 1)' et obtenir (1, 1)? Cela ressemble à ce que vous essayez de faire, mais vous continuez à mentionner 0, et je ne sais pas ce que cela signifie dans ce contexte –

+0

duplication possible de [Vérifier les index par rapport aux listes avec index] (http://stackoverflow.com/ questions/8783148/check-indexes-against-lists-with-indexes) – wim

+0

@wim Désolé mais je n'ai pas semblé obtenir quoi que ce soit et j'ai décidé de reformuler ma question et de partir d'un autre point de vue. Cela semble avoir fonctionné! – cbbcbail

Répondre

1

essayer ceci dans un fichier python:

list_of_lists = [ 
    [4, 5, 6], 
    [7, 0, 8], 
    [6, 2, 9] 
] 

def index_of(value, matrix): 
    for i, r in enumerate(matrix): 
     for j, c in enumerate(r): 
      if c == value: 
       # returns the first instance 
       return (i,j) 
    return None 

if index_of(0, list_of_lists) == (1,1): 
    print "hey" 

list_of_lists2 = [ 
    [0, 5, 6], 
    [7, 0, 8], 
    [0, 2, 9] 
] 

def indexes_of(value, matrix): 
    return [(i,j) for i, r in enumerate(matrix) for j, c in enumerate(r) if c == value] 

print indexes_of(0, list_of_lists2) 

sorties

hey 
[(0, 0), (1, 1), (2, 0)] 

[EDIT] Comme demandé:

Tout d'abord, qu'est-ce que l'énumération fait?

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter'] 
>>> list(enumerate(seasons)) 
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] 
>>> list(enumerate(seasons, start=1)) 
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')] 

source

Comme vous pouvez le voir, si vous utilisez énumérer, il retournera à la fois l'indice de l'élément et l'élément. Par conséquent, pendant que vous itérez la liste retournée, vous pouvez y accéder et faire ce que vous désirez.Voilà ce que je fais ici:

for i, r in enumerate(matrix) 

Dans ce cas, i représente l'indice de ligne, et r représente pour la ligne elle-même. D'accord?

Dans la ligne suivante, vous faites la même chose, mais maintenant vous êtes en train d'énumérer la ligne elle-même, d'accord? Et vous obtenez, maintenant, les index des valeurs j et les valeurs c qui sont stockées dans chaque ligne. Enfin, lorsque vous renvoyez (i, j), vous renvoyez simplement un tuple qui représente l'indice de la matrice des valeurs.

+0

Merci, je pense que cela va vraiment aider! – cbbcbail

+0

Pourriez-vous me dire comment tout cela fonctionne s'il vous plaît? Merci! – cbbcbail

+0

Pourriez-vous être plus précis? Quelle partie vous dérange? – wleao

1

Quelque chose comme ceci:

def lindex(list_of_lists, item): 
    for l in list_of_lists: 
     if item in l: 
      return list_of_lists.index(l) 

listoflists = [[4, 5, 6], [7, 1, 8], [6, 2, 9]] 
item = 1 
print "it is in the %. row" % lindex(listoflists, item) 

Quant à votre tentative de raccourci avec:

if 1 in row for row in list_of_lists: 
  1. La syntaxe est incorrecte!
  2. Vous ne pouvez pas éviter de regarder dans tous les éléments de chaque ligne de la liste - pas de raccourci
  3. Pour un halway bon compromis à 1. vous pouvez essayer quelque chose comme:

    rangs = [i pour i en listoflists si 1 i]

Ce serait à vous donner soit une liste vide, ce qui signifie qu'il n'y a aucun article avec la valeur « 1 » ou une liste contenant les lignes « 1 »!

Vous pouvez ensuite imprimer toutes les lignes-indices contenant 1 avec:

for row in rows: 
    print "it is in the %. row" % listoflists.index(row) 
+0

Il existe des cas où les différents index que je vérifie ne sont pas dans les lignes. Comment pourrais-je le faire d'une manière où il ne serait pas regarder les rangées? – cbbcbail

+1

YVous ne pouvez pas vérifier si un index est dans une rangée ou non sans regarder ... avez-vous des informations préalables qui vous permettent de savoir à l'avance quand une valeur ne figure pas dans 'list_of_lists'? –

+0

Au début de mon "code" j'ai "si 1 dans la ligne pour la ligne dans list_of_lists:" Cela devrait vérifier si elle est dans list_of_lists. – cbbcbail

1

est ici une façon de le faire:

>>> for lst in range(len(list_of_lists)): 
...  if 1 in list_of_lists[lst]: 
...    print "it's in list:", lst 
... 
it's in list: 1 
>>> 

rappeler les in opérateur teste si une valeur apparaît dans une liste (ou liste comme objet).

Voici une seconde façon d'utiliser la méthode index (discutée dans les commentaires);

>>> for lst in range(len(list_of_lists)): 
...  try: 
...    _ = list_of_lists[lst].index(1) 
...    print "1 is in list", lst 
...  except ValueError: 
...    continue 
... 
1 is in list 1 
>>> 
+0

Comment pourrais-je utiliser ceci si je ne voulais pas toujours vérifier s'ils étaient dans les lignes? – cbbcbail

+0

Vous voulez dire, sans utiliser 'in'? Plusieurs façons, vous pouvez utiliser la méthode 'index':' mylist.index (3) 'retourne l'index de la valeur' 3' dans la liste 'mylist' – snim2

+0

Oui, je sais comment faire ça. Mais comment puis-je vérifier si index (3) était l'un des trois index ou quelque chose comme dans ma question? – cbbcbail

0
for i,list in enumerate(list_of_lists, 1): 
    if 1 in list: 
     if i == 1: 
      "it is in the first list" 
     elif i == 2: 
      "it is in the second list" 
     ... 

C'est une implémentation de base. Vous voudriez paramétrer ceci mais je ne suis pas sûr exactement de ce que seraient vos entrées.

Questions connexes