2013-04-05 4 views
6

J'ai une liste des listes:Rechercher une liste en utilisant une chaîne

A = [['andy', 'dear', 'boy', 'tobe', 'todo'], 
     ['where', 'what', 'when', 'how'], 
     ['korea', 'japan', 'china', 'usa'], 
     ['tweet', 'where', 'why', 'how']] 

Je trois des questions pour être exact:

  1. Comment puis-je récupérer une sous-liste de cette liste utiliser un élément particulier comme mot-clé?
    Par exemple, je veux récupérer toutes les listes ayant l'élément «pourquoi» dans eux? Qu'est-ce que
    la meilleure façon de le faire?
  2. Comment puis-je récupérer une sous-liste de cette liste en utilisant une partie d'un élément particulier en tant que mot-clé?
    Par exemple, je veux récupérer toutes les listes ayant des éléments contenant «wh» comme commençant
    caractères de l'un des éléments?
  3. Comment obtenir la position ou l'index des sous-listes résultantes de l'une de ces deux méthodes de recherche?

Je suis familier avec le concept de récupérer tous les éléments d'une liste avec correspondance avec un mot-clé particulier, mais sa confusion quand il vient pour récupérer toutes les listes correspondant à un mot clé ...

Tous suppositions? Merci d'avance.

Répondre

2

Pour première:

>>> for l in A: 
...  if 'why' in l: 
...    print l 
... 
['tweet', 'where', 'why', 'how'] 

Pour la seconde : (wy ne importe où)

>>> for l in A: 
...  for i in l: 
...    if 'wh' in i: 
...      print l 
...      break 
... 
['where', 'what', 'when', 'how'] 
['tweet', 'where', 'why', 'how'] 

pour tester au début, essayez ceci: (en utilisant startswith() de @Harido)

>>> for l in A: 
...  for i in l: 
...    if i.startswith('wh'): 
...      print l 
...      break 
... 
['where', 'what', 'when', 'how'] 
['tweet', 'where', 'why', 'how'] 

Pour troisième:

Pour trouver index, vous pouvez utiliser la méthode A.index(l) après stamens impression par exemple:

>>> for l in A: 
...  for i in l: 
...    if 'wh' in i: 
...      print l 
...      print A.index(l) 
...      break 
... 
['where', 'what', 'when', 'how'] 
1 
['tweet', 'where', 'why', 'how'] 
3 

Mais rappelez-vous que je ne suis pas bon en Python. Quelqu'un peut vous donner de meilleurs moyens. (Je vous écris C comme code qui est pauvre) Je voudrais partager ce lien: Guido van Rossum

Modifier:

grâce à @Jaime me suggérer for k, l in enumerate(A):

>>> for k, l in enumerate(A): 
...  for i in l: 
...    if 'wh' in i: 
...      print l 
...      print "index =", k 
...      break 
... 
['where', 'what', 'when', 'how'] 
index = 1 
['tweet', 'where', 'why', 'how'] 
index = 3 
+1

Belle photo, Grijesh! C'est très bien. Je peux seulement marquer une question comme une bonne réponse, et la vôtre peut probablement être la bonne. Laissez-moi attendre les prochaines réponses aux questions 2 et 3 aussi (ou peut-être si vous pouvez ajouter). – khan

+0

@khan ok fait l'examen. Mais je ne suis pas bon en Python attendre quelqu'un comme [martijn-pieters] (http://stackoverflow.com/users/100297/martijn-pieters) pour de meilleures réponses –

+1

Au lieu de faire 'A.index (l)', changer la boucle for à 'pour k, l dans énumérer (A):' et 'k' est l'indice de' l' sans avoir besoin de le chercher. – Jaime

0

vous deviendriez faire de la même façon que vous le feriez pour une liste unique, sauf que vous aurez besoin d'une boucle supplémentaire:

for inner_list in A: 
    for element in inner_list: 
     if # <some condition> 
      # <do something> 

pour Posi tions, en ajoutant un enumerate dans la boucle spécifique que vous voulez que la position aidera, ou en utilisant simplement quelque chose comme find pour chaque liste interne fera également le travail.

3

Pour toutes les réponses combinées:

mylist = [['andy', 'dear', 'boy', 'tobe', 'todo'], ['where', 'what', 'when', 'how'], ['korea', 'japan', 'china', 'usa'], ['tweet', 'where', 'why', 'how']] 
for num, sublist in enumerate(mylist): 
    if 'why' in sublist: 
     print sublist 
    for ele in sublist: 
     if ele.startswith('wh'): 
      print ele, num 
+0

Merci, Haidro. Ceci est vraiment bon. Je n'avais aucune idée que quelque chose comme string.startswith() et string.endswith() existe déjà. Merci beaucoup. :-) – khan

+0

@khan ce sont ces fonctions qui me font aimer la simplicité de python: D – TerryA

+0

@Haidro La meilleure façon d'obtenir un index avec python est d'utiliser 'enumerate'. Si vous vérifiez 'A.index (x)', vous devrez effectuer une nouvelle recherche dans la liste et ne pourrez donc pas travailler avec des listes en double – jamylak

0

a. Supposons que vous ayez une liste A et le mot que vous recherchez est x. En gros, lis est une liste qui contient toutes les listes qui ont ce mot. vous parcourez la liste originale. chaque élément x est une liste. x.count (mot) vous indique combien de fois ce mot est dans cette liste. 0 signifie qu'il n'est jamais apparu dans la liste. donc s'il est supérieur à 0, il doit être dans la liste. Si c'est le cas, nous avons ajouté à notre variable lis. alors nous le retournons.

b. c'est la même chose que le problème a sauf au point A, après avoir obtenu la liste, faites une autre boucle pour chaque mot qui s'y trouve. pour python, il y a une fonction de recherche des chaînes pour voir si une sous-chaîne existe là-dedans si elle n'existe, ajoutez à l'élément de la liste:

http://docs.python.org/2/library/string.html

c. pour le problème a, après avoir vérifié que ce nombre est supérieur à 0, cela signifie que le mot existe dans la liste. faire un list.index (mot) et il retournera l'index. pour le problème b, une fois que vous trouvez une chaîne avec la sous-chaîne appropriée, faites un list.index (mot). Dans l'ensemble, vous devriez regarder le site python, il vous dit beaucoup de fonctions que vous pouvez utiliser.

+0

'pour chaque x dans A:' est une syntaxe invalide: 3. – TerryA

+0

merci désolé à ce sujet, à droite, il devrait être "pour x en A:" je suppose que cela itère la liste entière, il pensait un peu comme un pour chacun. Je l'ai confondu avec autre chose. – Jeff

0
>>> A = [['andy', 'dear', 'boy', 'tobe', 'todo'], ['where', 'what', 'when', 'how'], ['korea', 'japan', 'china', 'usa'], ['tweet', 'where', 'why', 'how']] 
>>> for i, sublist in enumerate(A): 
     if 'why' in sublist: 
      print i, sublist 


3 ['tweet', 'where', 'why', 'how'] 
>>> for i, sublist in enumerate(A): 
     if any(word.startswith('wh') for word in sublist): 
      print i, sublist 


1 ['where', 'what', 'when', 'how'] 
3 ['tweet', 'where', 'why', 'how'] 
2

I love compréhensions de liste et la programmation fonctionnelle, voici donc cette approche

A

sub_list_a = [ el for el in A if 'why' in el ] 

B

sub_list_b = [ el for el in A if any(['wh' in s for s in el]) ] 

Un peu plus difficile à lire, mais concis et sens ible.

C

ensuite pour obtenir les indices de l'endroit où chacun des sub_lists ont été trouvés

location_a = [ ii for ii, el in enumerate(A) if el in sub_list_a ] 

Remplacez simplement b pour a pour obtenir les emplacements pour la partie b.

+1

Plus élégant et concis ** B **: 'sub_list_b = [el pour el dans A s'il y en a ('wh' dans s pour s dans el)]'. imo essayez de ne pas utiliser 'map' si vous devez utiliser' lambda' avec ça – jamylak

+0

@jamylak Ouais, j'aime mieux aussi, merci! Modification mineure, cependant, que comme écrit n'a pas fonctionné pour moi, voir ci-dessus. –

+1

également vous devez omettre les parenthèses à l'intérieur du 'any' de sorte qu'il devienne un générateur au lieu d'un comp de liste. – jamylak

6

simple et droit

elem = 'why' 
index_li = [] 
for idx, item in enumerate(A): 
    for word in item: 
     if word.startswith(elem): 
      index_li.append(idx) 
      break 
print index_li 

Exemple

>>> elem = 'wh' 
... index_li = [] 
... for idx, item in enumerate(A): 
...  for word in item: 
...   if word.startswith(elem): 
...    print word, item 
...    index_li.append(idx) 
...    break 
... print index_li 
where ['where', 'what', 'when', 'how'] 
where ['tweet', 'where', 'why', 'how'] 
[1, 3] 
0

Vous pouvez utiliser cette approche simple:

>>> key='wh' 
>>> res=[(index, sublist) for index, sublist in enumerate(A) for value in sublist if value.startswith(key)] 
>>> dict(res) 
{1: ['where', 'what', 'when', 'how'], 3: ['tweet', 'where', 'why', 'how']} 

profiter!

Questions connexes