我想将一个列表划分为n个子列表,并打印所有可能的子列表。n是用户输入的整数。列表的长度可以是任何值1<n<len(list(
For example
if list = [1,2,3,4]
and n=1
solution = [1,2,3,4]
if n=2
solution=([1],[2,3,4]),([1,2],[3,4]),([1,2,3],[4])
if n=3
solution=([1],[2],[3,4]),([1,2],[3],[4]),([1],[2,3],[4])
注意:-括号不表示元组或任何其他数据类型的输出可以是任何形式。Ps:-这不是一个代码,但stackoverflow强迫我将其格式化为这样这就是我尝试的
''''蟒蛇
lst=[]
lst1=[]
lst4=[]
for i in range(0,10000):
element=int(input())
lst.append(element)
print("If you want to continue adding list press y else press n")
choice=input()
if choice=='y':
continue
elif choice=='n':
break
else:
print("please enter a valid choice")
print("Enter division size")
N=int(input())
maxchunk=len(lst)-N+1
for j in range(maxchunk,0,-1):
rchunk=(len(lst)-j)//(N-1)
lst2=lst[0:j]
lst1.append(lst2)
chunksize=((len(lst)-j)+1)//(N-1)
print(chunksize)
for k in range(j,len(lst),chunksize):
lst3=lst[k:k+chunksize]
lst1.append(lst3)
lst4.append(lst1)
lst1=[]
print(lst4)
''
您可以使用itertools.combinations
迭代所有方法来选择列表的n-1
分割点:
from itertools import combinations
lst = [10, 20, 30, 40, 50]
n = 3
result = []
# n-1 split points:
for indices in combinations(range(1, len(lst)), n-1):
# indices are the indices of split points
splits = []
start = 0
for stop in indices:
splits.append(lst[start : stop])
start = stop
splits.append(lst[start : ])
result.append(splits)
result
:
[[[10], [20], [30, 40, 50]],
[[10], [20, 30], [40, 50]],
[[10], [20, 30, 40], [50]],
[[10, 20], [30], [40, 50]],
[[10, 20], [30, 40], [50]],
[[10, 20, 30], [40], [50]]]
这里有一种使用递归生成器函数的替代方法,该函数为给定的数组和分区数量生成所有所需的分区。
def partition(arr, n):
if n == 1:
yield (arr,)
else:
for i in range(1, len(arr)):
for other in partition(arr[i:], n-1):
yield (arr[:i],) + other
你可以称之为
for item in partition([1,2,3,4], 3):
print(item)
显示
([1], [2], [3, 4])
([1], [2, 3], [4])
([1, 2], [3], [4])
或者,如果你想一次访问所有
print(list(partition([1,2,3,4], 3)))
显示
[([1], [2], [3, 4]), ([1], [2, 3], [4]), ([1, 2], [3], [4])]