#list #elements #items
#Список #элементы #Товары
Вопрос:
Я новичок и работаю над этим уже неделю, но не могу найти никакого решения. Я надеюсь, что кто-нибудь может помочь мне разобраться в этом.
Как я могу найти элементы в списке — listitems и вывести их элементы по отдельности?
listitems = ['Beer, Chicken', 'Cake, Chocolate', 'Lemon with ci, Chicken', 'Beer, Beer, Cake, Chocolate']
Могу ли я в любом случае вычислить соответствующую еду в списке поступлений?
Пока я могу найти продукты только для ОДНОГО элемента. Мой код выглядит следующим образом:
Я также вычислил другой список каждого элемента для сравнения.
eachitems = ['Beer', 'Cake', 'Chocolate', 'Lemon with ci', 'Chicken']
Комментарии:
1. каковы критерии для двух продуктов, которые должны быть связаны. откуда я знаю, что торт ассоциируется и с пивом, и с шоколадом?
Ответ №1:
Я бы лично использовал словарь на основе ключей для каждого элемента со связанными элементами в качестве их значений, вам также было бы намного проще получить желаемые результаты, не совсем уверен, что знаю, как я мог бы сделать это только из списка, который вы создали.
Из вашего исходного кода добавьте «print (combi) «, » print (checklist) » и » print (correlatedlist) » в конце, и вы увидите, что на самом деле он не добавляет его так, как вы хотите.
Ответ №2:
В 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 ()
Выведет:
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
Если вы не хотите использовать itertools и *, вы также можете создавать цикл в цикле, чтобы обходить все элементы listOfLists и добавлять их в allFoods, которые вы изначально делаете пустыми.
Ответ №3:
Мне потребовалось некоторое время, чтобы точно понять, чего вы хотели, но это рабочее решение.
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)))
Вывод
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
Ключевой частью этого решения является использование наборов для удаления повторяющихся элементов и оператора |
(union).
В качестве примечания, вместо того, чтобы использовать |
так
result = result | itemlist
вы можете изменить набор на месте с помощью
result.update(itemlist)
Комментарии:
1. @E M есть отзывы?