#python
#python
Вопрос:
У меня есть файл CSV, который выглядит примерно так:
Person 1 Person 2 Person 3 Person 4
a Apple Apple Yam Beer
b Orange Orange Doritos Cheese
c Pineapple Nintendo Apple Sushi
d Pizza Cheese Orange Pineapple
e Doritos Fanta Pizza Orange
f Coke Fajita Cake Coke
g Strawberry Juice Beer Tea
h Blackberry Yam
i Sushi
Каждый столбец представляет каждого пользователя, а каждая строка — элемент, который нравится каждому соответствующему пользователю (строка).
Я пытаюсь придумать алгоритм, который может предоставить мне список уникальных комбинаций, используя каждый элемент только один раз и в то же время предоставляя пользователю один элемент, который он хочет.
Что-то вроде:
1)
Person 1 Person 2 Person 3 Person 4
Apple Orange Yam Beer
2)
Person 1 Person 2 Person 3 Person 4
Apple Orange Yam Cheese
.. и так далее.
Не мог бы кто-нибудь подсказать мне, как подойти к этой проблеме? Я новичок в Python.
Комментарии:
1. Возможно, вы сможете адаптировать решение к проблеме стабильного брака в соответствии с вашими потребностями.
Ответ №1:
Без библиотек:
pools = ['Apple', 'Orange', ...], ['Apple', 'Orange', ...], [...], [...]]
result = [[]]
for pool in pools:
result = [x [y] for x in result for y in pool if y not in x]
print(result)
Комментарии:
1. Необходимо
result = [x [y] for x in result for y in pool if y not in x]
отфильтровывать комбинации, содержащие повторяющиеся элементы.2.
set(result)
вызовет ошибку, поскольку списки не могут быть хэшированы, вы можете либо использовать комментарий Джона, либо сохранить кортежи вместо списков внутриresult
Ответ №2:
Я бы использовал itertools.product() для генерации комбинаций, затем выбрал допустимые (без повторяющихся элементов) с помощью set().
Что-то вроде этого:
from itertools import product
person_1 = ['Apple', 'Orange', 'Pineapple', ...]
person_2 = ['Apple', 'Orange', 'Nintendo', ...]
person_3 = ['Yam', 'Doritos', 'Apple', ...]
person_4 = ['Beer', 'Cheese', 'Sushi', ...]
for p in product(person_1, person_2, person_3, person_4):
if len(p) == len(set(p)):
print(p)
Ответ №3:
Вот еще один подход с использованием pandas:
import pandas as pd
d= {"Person 1" : ['Apple', 'Orange', 'Pineapple', ...],"Person 2" : ['Apple', 'Orange', 'Nintendo', ...],"Person 3" : ['Yam', 'Doritos', 'Apple', ...],"Person 4" : ['Beer', 'Cheese', 'Sushi', ...]}
df = pd.DataFrame(data=d)
df=df.drop_duplicates()
df=df.dropna(axis=0)
print(df)
Ответ №4:
pools = [['Apple', 'Orange','Pineapple'], ['Apple', 'Orange','pizza'],['Apple',
'Orange','pizza','beer']]
results = []
for pool in pools:
results.append([item for item in pool if item not in results][0])
Output: ['Apple', 'Orange', 'pizza']