【发布时间】:2017-06-01 09:19:29
【问题描述】:
如here 所述,我已经使用列表中的元素生成了所有可能的组合。现在,我想知道如何将每个组合保存为列表。 我得到这个输出:
[('A',),
('B',),
('A','B')
......]
我会得到这样的东西:
[['A'],['B'],['AB'], ...... ]
有没有简单的实现方法?
【问题讨论】:
如here 所述,我已经使用列表中的元素生成了所有可能的组合。现在,我想知道如何将每个组合保存为列表。 我得到这个输出:
[('A',),
('B',),
('A','B')
......]
我会得到这样的东西:
[['A'],['B'],['AB'], ...... ]
有没有简单的实现方法?
【问题讨论】:
你可以像这样使用map:
combinations = [('A',),
('B',),
('A','B')]
combinations_list = map(list, combinations)
这将返回 generator (Python3) 或 list (Python2)。如果您想要 list,只需将其投射到列表中:
combinations_list = list(map(list, combinations))
这会将内部元组结构转换为列表:
[("A"), ("B"), ("A", "B")] -> [["A"], ["B"], ["A", "B"]]
如果你还想展平元组得到以下结果:
[("A"), ("B"), ("A", "B")] -> [["A"], ["B"], ["AB"]]
您应该为此更改map 的第一个参数:
lambda sub_tuple: ["".join(sub_tuple)]
【讨论】:
如果你说你有一个元组列表,并且你想要一个列表列表,你可以使用转换它
list_of_lists = [list(t) for t in list_of_tuples]
或者你可以使用map。
在 Python 2 中:
list_of_lists = map(list, list_of_tuples)
在 Python 3 中:
list_of_lists = list(map(list, list_of_tuples))
【讨论】:
按照 OP 链接的example:
from itertools import combinations
lis = ['A', 'B', 'C', 'D']
result = []
for i in range(1, len(lis)+1):
result+=[''.join(c) for c in combinations(lis, i)]
print(result)
给了
['A', 'B', 'C', 'D', 'AB', 'AC', 'AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'ACD', 'BCD', 'ABCD']
编辑:
同单行:
result = [''.join(c) for i in range(1,len(lis)+1) for c in combinations(lis,i)]
【讨论】:
您可以使用str.join 的列表推导:
>>> combinations = [('A',), ('B',), ('A','B')]
>>> [[''.join(comb)] for comb in combinations]
[['A'], ['B'], ['AB']]
您也可以使用生成器表达式来代替列表理解:
>>> combs_as_lists = ([''.join(comb)] for comb in combinations)
>>> for comb in combs_as_lists:
... print(comb)
['A']
['B']
['AB']
【讨论】: