从Python列表中获取元素的所有唯一组合

时间:2020-01-15 17:15:17

标签: python list combinations itertools

我查找了许多相关问题,但没有人真正回答我如何在列表中接收所有元素的组合。例如,使用此输入列表

input_list = ["apple", "orange", "carrot"]

我想要这份清单:

output_list = [ ["apple"], ["orange"], ["carrot"], ["apple", "orange"],  ["apple", "carrot"], ["orange", "carrot"], ["apple", "orange", "carrot"]]

即我还希望包含单个条目,该怎么办?

4 个答案:

答案 0 :(得分:2)

您正在寻找powerset itertools recipe

from itertools import chain, combinations

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

>>> input_list = ["apple", "orange", "carrot"]
>>> print(list(map(list, powerset(input_list)))[1:])
[['apple'], ['orange'], ['carrot'],['apple', 'orange'], ['apple', 'carrot'], ['orange', 'carrot'], ['apple', 'orange', 'carrot']]

答案 1 :(得分:1)

这几乎是您要寻找的内容,减去一些格式:

from itertools import combinations
input_list = ["apple", "orange", "carrot"]
combis = [[i for i in combinations(input_list, 1)], [i for i in combinations(input_list, 2)], [i for i in combinations(input_list, 3)]]

输出:

 [[('apple',), ('orange',), ('carrot',)],
 [('apple', 'orange'), ('apple', 'carrot'), ('orange', 'carrot')],
 [('apple', 'orange', 'carrot')]]

答案 2 :(得分:1)

一个班轮的答案是:

[list(j) for i in range(len(input_list )) for j in itertools.combinations(input_list , i+1)]

第一个循环(i)遍历所有不同的组合并创建组合对象,然后第二个循环(j)遍历该组合的每个元素并制作一个列表,然后追加它到原始列表。输出随心所欲,无需任何更改。

答案 3 :(得分:1)

itertools文档提供了一组useful recipes,用于使用该模块轻松实现的操作;其中有一个电源设置发生器:

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

给出字符串列表,您将获得一个元组列表。

>>> list(powerset(input_list))
[(), ('apple',), ('orange',), ('carrot',), ('apple', 'orange'), ('apple', 'carrot'), ('orange', 'carrot'), ('apple', 'orange', 'carrot')]

空元组很容易过滤,并且可以根据需要将元组转换为列表。

>>> list(list(x) for x in powerset(input_list) if x != ())
[['apple'], ['orange'], ['carrot'], ['apple', 'orange'], ['apple', 'carrot'], ['orange', 'carrot'], ['apple', 'orange', 'carrot']]