Добавление уникальных комбинаций списков из списка списков, включая значения int и str

#python #python-3.x #list #combinations #sublist

Вопрос:

У меня есть список подсписков, содержащий имя человека и 4 характеристики, которые измеряются двузначными числами. Список выглядит следующим образом

 stud_lst=[['Pete', '36', '36', '36', '30'], ['Derek', '31', '21', '31', '20'], ...]
 

Теперь я хочу объединить людей в пары и объединить их характеристики в группы по 2 и 3. Поэтому мне нужна каждая уникальная комбинация каждого подсписка, пока элементы подсписка суммируются.

Пример: Мне нужен следующий новый подлист ['PeteDerek', '67', '57', '67', '50'] для всех людей в базе данных, а также ['PeteDerekTommy' ...]

Я подумал о

  1. нарезка списка чтобы получить все имена, соедините их itertools.combinations и добавьте исходный список «stud_lst».
  2. Я мог бы сделать то же самое с фрагментами числового списка и добавить их zip в for цикл. Но потом я застреваю с соответствующим соответствием. Кроме того, это много кода, и я чувствую, что это не очень по-питонски

Существуют ли какие-либо библиотеки, которые могут помочь, или более разумный подход?

Комментарии:

1. Использование словаря python, скорее всего, значительно упростит весь этот процесс. Трудно помочь вам дальше с небольшим количеством информации о том, что вы делаете

Ответ №1:

Вы можете создать генератор, который полагается на itertools.combinations :

 from functools import reduce
import itertools as it


def combine_all(people):
    for r in range(2, len(people) 1):
        for combination in it.combinations(people, r):
            yield reduce(combine_two, combination)


def combine_two(a, b):
    a_name, *a_attr = a
    b_name, *b_attr = b
    return [f'{a_name}{b_name}', *[f'{int(x) int(y)}' for x, y in zip(a_attr, b_attr)]]


from pprint import pprint
pprint(list(combine_all(stud_lst)))