2017-03-07 1 views
0

J'essaie de compter le nombre de fois qu'un mot dans une liste imbriquée se produit en fonction d'une liste de mots différente. Par exemple:Comptage d'éléments dans des listes imbriquées basées sur une autre liste

one = [['apple','pear','bear'],['apple','drawers','bear','grapes']] 
word = ['pear','oranges','pineapple','scones','drawers'] 

Je veux compter combien de fois chaque mot dans le mot de la liste se produit dans chaque liste imbriquée appelée one. En sortie, je veux:

new_one = [[0,1,0],[0,1,0,0]] 

J'ai essayé d'utiliser .count mais .count ne pas utiliser des éléments dans une liste, mais seule chaîne ou entiers. Je ne pouvais pas utiliser pour la boucle pour indexer les éléments du mot en utilisant .count(). La même chose est pour Counter, qui ne semble pas fonctionner pour les listes imbriquées, ou dans une boucle for.

Je pourrais penser à utiliser des dictionnaires mais finalement je veux new_one être une liste de listes, puisque je veux transformer new_one en une matrice où une rangée est une rangée d'une matrice.

Répondre

0
one = [['apple','pear','bear'],['apple','drawers','bear','grapes']] 
word = ['pear','oranges','pineapple','scones','drawers'] 
output = [] 

# create a dict and populate with keys being unique words and values being its occurances 
d = {} 

for x in one: 
    for y in x: 
     d[y] = word.count(y) 

# go through each word in sublist and find the count from the dict 
for x in ne: 
    output.append([d[y] for y in x]) 

Cela devrait vous donner:

output = [[[0, 1, 0], [0, 1, 0, 0]]] 
0

Voici une approche possible:

[[[1 if z == x else 0 for z in y] for y in one] for x in word] 

Sortie:

[[[0, 1, 0], [0, 0, 0, 0]], 
[[0, 0, 0], [0, 0, 0, 0]], 
[[0, 0, 0], [0, 0, 0, 0]], 
[[0, 0, 0], [0, 0, 0, 0]], 
[[0, 0, 0], [0, 1, 0, 0]]] 
+0

Cela tombe bien, mais pourrait-il fonctionner quand Apple se produit deux fois? – song0089

+0

Bien sûr! Si 'one' était' one = [['apple', 'pear' ',' bear ',' pear '], [' apple ',' tiroirs ',' ours ',' raisins ']] ', la sortie inclurait un 1 dans la nouvelle fente où 'poire' est. Essayez-le! :) –

+0

oh ok, y aurait-il un moyen de les compter si ...? pour la pomme, retournez deux? – song0089

0

La meilleure façon de le faire est d'utiliser une compréhension de liste imbriquée:

[[word.count(w) for w in l] for l in one] 

Ceci est légèrement inefficace car il compte les occurrences de chaque mot à chaque fois (par ex. il va effectuer word.count('apple') deux fois), mais si vos listes ne sont pas très longues, ce ne sera pas un problème.

+0

Quel est le mot ici? si elle se réfère à la liste imbriquée, elle ne fonctionne pas. – song0089

0

D'abord, nous itérons la liste de sortie, c'est-à-dire une. Pour chaque liste dans un, nous itérons les éléments, c'est-à-dire l'apple pear bear etc. Si cela correspond au mot de la liste, alors nous ajoutons à la liste temporaire new_one_temp. Dans chaque itération externe, nous ajoutons à la liste new_one.

one=[['apple','pear','bear'],['apple','drawers','bear','grapes']] 
word=['pear','oranges','pineapple','scones','drawers'] 

new_one=[] 
for list_elem in one: 
    new_one_temp=[] 
    for word_text in list_elem: 
     if word_text in word: 
      new_one_temp.extend([1]) 
     else: 
      new_one_temp.extend([0]) 
    new_one.append(new_one_temp) 
print new_one 

Sortie

new_one = [[0, 1, 0], [0, 1, 0, 0]]