添加列表列表的唯一列表组合,包括 int 和 str 值
Adding up unique list combinations of a list of lists including int and str values
我有一个子列表列表,其中包含一个人的姓名和 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
循环中。
但后来我陷入了适当的匹配。另外,这是很多代码,我觉得这不是很 pythonic
是否有任何图书馆可以提供帮助或更明智的方法?
您可以创建一个依赖于 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)))
我有一个子列表列表,其中包含一个人的姓名和 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
循环中。 但后来我陷入了适当的匹配。另外,这是很多代码,我觉得这不是很 pythonic
是否有任何图书馆可以提供帮助或更明智的方法?
您可以创建一个依赖于 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)))