Создание уникальной комбинации элементов из каждого столбца

#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']