2016-10-15 1 views
1

Ich bin neu und arbeite seit einer Woche daran, kann aber keine Lösung finden. Ich hoffe, dass mir jemand helfen kann, das herauszufinden.So finden Sie den Artikel in der Liste

Wie kann ich Elemente in der Liste finden - Listenelemente und ihre Elemente einzeln ausgeben?

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

Gibt es trotzdem ich kann das verwandte Essen in der Quittungsliste berechnen?

Bis jetzt kann ich nur die Lebensmittel für EINEN Gegenstand finden. Mein Code ist wie folgt:

Ich berechnete auch eine andere Liste jedes Artikels ist zum Vergleich.

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

ändern, was für zwei Lebensmittel die Kriterien sind assoziiert zu sein. Woher weiß ich, dass Kuchen mit Bier und Schokolade verbunden ist? – danidee

Antwort

0

Ich persönlich würde ein Wörterbuch für jedes Element mit dem dazugehörigen Elementen als ihre Werte basierend auf Tasten verwenden, auch viel einfacher wäre für Sie die gewünschten Ergebnisse erhalten zu, nicht ganz sicher richtig wissen, wie ich es erreichen würde von der Liste, die du nur gemacht hast.

Fügen Sie aus Ihrem ursprünglichen Code am Ende "print (combi)", "print (checklist)" und "print (correlatedlist)" hinzu und Sie werden sehen, dass es nicht so hängt, wie Sie möchten.

0

In 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() 

druckt:

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 

Wenn Sie nicht wollen, itertools verwenden und *, können Sie auch eine Schleife in einer Schleife machen alle Elemente zu durchqueren der listOfLists und füge sie zu allFoods hinzu, die du anfangs leer machst.

0

Es dauerte einige Zeit, um genau zu verstehen, was Sie wollten, aber das ist eine funktionierende Lösung.

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))) 

Ausgabe

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 

Sie wichtiger Teil dieser Lösung ist die Verwendung von Sets die doppelten Elemente und die | (Vereinigung) Operator zu entfernen.

Als Randbemerkung, statt | wie dies

result = result | itemlist 

verwenden, können Sie die Menge an Ort und Stelle mit

result.update(itemlist) 
+0

@E M keine Rückmeldung? – danidee

Verwandte Themen