2016-10-15 1 views
1

Je suis nouveau et travaille sur cela depuis une semaine maintenant, mais je ne trouve aucune solution. J'espère que quelqu'un pourra m'aider à comprendre cela. Comment puis-je trouver des éléments dans la liste - listitems et afficher leurs éléments individuellement?Comment trouver l'article dans la liste

Y at-il de toute façon je peux calculer l'aliment lié dans la liste de réception? Jusqu'à présent, je ne peux trouver les aliments que pour un seul article. Mon code est le suivant:

J'ai également calculé une autre liste de chaque article pour comparaison.

eachitems = ['Beer', 'Cake', 'Chocolate', 'Lemon with ci', 'Chicken'] 
+0

ce sont les critères pour deux aliments à associer. comment puis-je savoir que le gâteau est à la fois associé à la bière et au chocolat? – danidee

Répondre

0

Personnellement, j'utiliser un dictionnaire basé sur les touches de chaque élément avec les éléments associés comme leurs valeurs, serait également beaucoup plus facile pour vous d'obtenir les résultats que vous voulez, ne va pas exactement savoir comment j'accomplir de la liste que vous avez faite seulement. A partir de votre code d'origine, ajoutez "print (combi)", "print (checklist)" et "print (correlatedlist)" à la fin et vous verrez qu'il ne l'ajuste pas vraiment comme vous le souhaitez.

0

En Python 3.5:

import itertools 

listOfStrings = ['Beer, Chicken', 'Cake, Chocolate', 'Lemon with ci, Chicken', 'Beer, Beer, Cake, Chocolate'] 
print ('Original list:', listOfStrings) 
print() 

listOfLists = [group.replace (', ', ',') .split (',') for group in listOfStrings] 
print ('Turned into list of lists:', listOfLists) 
print() 

allFoods = set (itertools.chain (*listOfLists)) 
print ('All individual foods:', allFoods) 
print() 

listOfSets = [set (group) for group in listOfLists] 
print ('A list of sets is handy, since sets contain no duplicates:', listOfSets) 
print() 

dictOfFoods = dict ([[food, set()] for food in allFoods]) 
print ('Prepare a dictionary, where we can put the associated foods:', dictOfFoods) 
print() 

for food in dictOfFoods: 
    for foodSet in listOfSets: 
     if food in foodSet: 
      dictOfFoods [food] .update (foodSet) 
    dictOfFoods [food] .remove (food) 
print ('The dictionary is now filled:', dictOfFoods) 
print() 

for food in dictOfFoods: 
    print ('People who buy', food, 'also buy:') 
    for otherFood in dictOfFoods [food]: 
     print (otherFood) 
    print() 

imprimera:

Original list: ['Beer, Chicken', 'Cake, Chocolate', 'Lemon with ci, Chicken', 'Beer, Beer, Cake, Chocolate'] 

Turned into list of lists: [['Beer', 'Chicken'], ['Cake', 'Chocolate'], ['Lemon with ci', 'Chicken'], ['Beer', 'Beer', 'Cake', 'Chocolate']] 

All individual foods: {'Chocolate', 'Lemon with ci', 'Chicken', 'Cake', 'Beer'} 

A list of sets is handy, since sets contain no duplicates: [{'Chicken', 'Beer'}, {'Chocolate', 'Cake'}, {'Chicken', 'Lemon with ci'}, {'Chocolate', 'Cake', 'Beer'}] 

Prepare a dictionary, where we can put the associated foods: {'Chocolate': set(), 'Lemon with ci': set(), 'Cake': set(), 'Beer': set(), 'Chicken': set()} 

The dictionary is now filled: {'Chocolate': {'Cake', 'Beer'}, 'Lemon with ci': {'Chicken'}, 'Cake': {'Chocolate', 'Beer'}, 'Beer': {'Chocolate', 'Chicken', 'Cake'}, 'Chicken': {'Lemon with ci', 'Beer'}} 

People who buy Chocolate also buy: 
Cake 
Beer 

People who buy Lemon with ci also buy: 
Chicken 

People who buy Cake also buy: 
Chocolate 
Beer 

People who buy Beer also buy: 
Chocolate 
Chicken 
Cake 

People who buy Chicken also buy: 
Lemon with ci 
Beer 

Si vous ne voulez pas utiliser itertools et *, vous pouvez aussi faire une boucle dans une boucle pour parcourir tous les éléments listOfLists et ajoutez-les à allFoods, que vous rendez initialement vide.

0

Il m'a fallu un jour pour comprendre exactement ce que vous vouliez, mais c'est une solution de travail.

listitems = ['Beer, Chicken', 'Cake, Chocolate', 'Lemon with ci, Chicken', 'Beer, Beer, Cake, Chocolate'] 
eachitems = ['Beer', 'Cake', 'Chocolate', 'Lemon with ci', 'Chicken'] 

for item in eachitems: 
    assoc = [associated for associated in listitems if item in associated] 
    result = set() 
    for itemlist in assoc: 
     itemlist = itemlist.replace(', ', ',').split(',') 
     itemlist = set(itemlist) 

     itemlist.remove(item) 

     result = result | itemlist 
    print('People who buy {} also buy: '.format(item), ', '.join(sorted(result))) 

Sortie

People who buy Beer also buy: Cake, Chicken, Chocolate 
People who buy Cake also buy: Beer, Chocolate 
People who buy Chocolate also buy: Beer, Cake 
People who buy Lemon with ci also buy: Chicken 
People who buy Chicken also buy: Beer, Lemon with ci 

Ils élément clé de cette solution est l'utilisation de Sets pour supprimer les éléments en double et l'opérateur | (syndicat).

Comme une note de côté, au lieu d'utiliser | comme celui-ci

result = result | itemlist 

vous pouvez modifier la mise en place avec

result.update(itemlist) 
+0

@E M E t-il des commentaires? – danidee