如何解决如何查找从1到列表长度的列表的所有组合无Itertools
是否有一种简单的算法(最有可能是递归算法)来查找列表和所有大小(从大小为1的组合到列表的大小长度为组合)的所有组合?
例如:如果我有一个列表= [1、2、3、4],则我应该获得的所有大小的组合为:
[1],[2],[3],[4],[1,2],[1,3],[1,4],[2,3],[2,4],[ 3,4],[1,2,3,4]。
所以我只知道我在网上找到的一种递归算法,该算法可以找到大小为n的组合,但不能找到从1到列表长度的所有大小。顺序无关紧要。
这是我在网上找到的代码:
def n_length_combo(lst,n):
if n == 0:
return [[]]
l =[]
for i in range(0,len(lst)):
m = lst[i]
remLst = lst[i + 1:]
for p in n_length_combo(remLst,n-1):
l.append([m]+p)
return l
这仅对大小为n的组合有用。但是我想找到从1到列表长度的所有大小的组合。
这里有什么想法吗?
解决方法
使用len函数以列表的长度调用它:
n_length_combo(lst,len(lst))
更好的是,如果您不想始终传递第二个参数,则可以分配默认值:
def n_length_combo(lst,n=len(lst)):
,
请参见下文(使用itertools)
from itertools import combinations
lst = [1,2,3,4]
final_lst = []
for x in lst[1:]:
final_lst.extend(combinations(lst,r=x))
print(final_lst)
输出
[(1,2),(1,3),4),(2,(3,4)]
,
使用已有的功能,但收集所需的所有组合长度的结果:
L = [1,4]
result = []
for n in range(1,len(L) + 1):
result.extend(n_length_combo(L,n))
print(result)
输出:
[[1],[2],[3],[4],[1,2],3],4],[2,[3,4]]
这是一个完整的递归生成器:
def all_combo(lst):
def n_combo(lst,n):
if n == 1:
yield from ([n] for n in lst)
for i,item in enumerate(lst):
for combo in n_combo(lst[i+1:],n-1):
yield [item] + combo
for n in range(1,len(lst)+1):
yield from n_combo(lst,n)
L = list(all_combo([1,4]))
print(L)
输出:
[[1],4]]
,
对于列表中的每个元素:您可以采用该元素,也可以不采用该元素。 这给了我们一个递归公式:
combinations(l) = combinations(l[:-1]) + [add l[-1] to every element of combinations(l[:-1])
这为我们提供了递归算法:
def combinations(l):
if not l:
return [[]]
else:
c = combinations(l[:-1])
return c + [r+[l[-1]] for r in c]
print(combinations(range(4)))
# [[],[0],[1],[0,1],1,3]]
当然不需要递归:
def combinations(l):
c = [[]]
for x in l:
c = c + [r+[x] for r in c]
return c
print(combinations(range(4)))
# [[],3]]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。