将一个 N 位整数拆分为 M 个数字

时间:2021-06-18 02:35:38

标签: python

我想用 python 编写一个代码,当你将一个 N 位整数拆分成 M 个片段时,它列出了所有可能的排列,例如:-235654 是一个 6 位数字。这里n=6。让 m=6,那么唯一可能的排列是 2,3,5,6,5,4。如果 m=3,那么将有 10 种可能的排列,如 2,3,5654 23,56,54 235,6,54....等。通过添加在数字之间放置两个逗号的所有可能方式,您可以轻松计算此类排列的总数。在这种情况下,它是 5!/2!3!。但是编写代码来列出所有排列似乎非常困难。当我们尝试将 5 位数字(如 12345)分成 3 个部分时,例如:-1,2,345 和 12,34,5,有人可以编写程序或算法来列出所有可能的排列。现在我只能使用以下代码将数字分成 2 部分。

c=[1,2,3,4,5]
l=len(c)
i1=0
a=[]
b=[]
while i1<l-1:
    i2=0
    while i2<=i1:
        a.append(c[i2])
        i2=i2+1
    i1=i1+1
    while i2<l:
        b.append(c[i2])
        i2=i2+1
    print(f"{a} {b}")
    a=[]
    b=[] 

1 个答案:

答案 0 :(得分:0)

您可以使用 itertools.combinations 来查找所有可以拆分字符串的可能索引:

from itertools import combinations


def all_splits(s, num):
    perms = [[0] + list(i) + [len(s)] for i in list(combinations(range(1, len(s)), num - 1))]
    return [[s[indices[i]: indices[i + 1]] for i in range(len(indices) - 1)] for indices in perms]


print(all_splits("abcdef", 6))
# Output: [['a', 'b', 'c', 'd', 'e', 'f']]

print(all_splits("abcdef", 3))
# Output: [['a', 'b', 'cdef'], ['a', 'bc', 'def'], ['a', 'bcd', 'ef'], ['a', 'bcde', 'f'], ['ab', 'c', 'def'],
#          ['ab', 'cd', 'ef'], ['ab', 'cde', 'f'], ['abc', 'd', 'ef'], ['abc', 'de', 'f'], ['abcd', 'e', 'f']]

print(all_splits("abcdef", 1))
# Output: [['abcdef']]