#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' ...]
Я подумал о
- нарезка списка чтобы получить все имена, соедините их
itertools.combinations
и добавьте исходный список «stud_lst». - Я мог бы сделать то же самое с фрагментами числового списка и добавить их
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)))