Разбить число на все возможные группы цифр, сохраняя оригинальный порядок - PullRequest
2 голосов
/ 31 января 2020

У меня есть номер, который я хочу разделить, как показано ниже. Я хочу сохранить порядок, в котором присутствует номер, но список, составленный из этого, должен поддерживать исходный порядок номера.

У меня есть номер 3147, который можно разделить, как показано ниже. 3147 можно разделить на 31, 47 или 3,1,47 et c. Но порядок оригинального числа не должен быть потерян.

Так как я могу это реализовать?

Было бы лучше, если бы я получил ответ на Python, но на любом другом языке тоже хорошо.

Input
3147

Output

[3,1,4,7]
[3,147]
[3,1,47]
[31,4,7]
[31,47]
etc

Ответы [ 3 ]

5 голосов
/ 31 января 2020

Вы можете использовать адаптацию моего ответа здесь :

Код:

def splitter(n):
    s = str(n)
    for i in range(1, len(s)):
        start = s[0:i]
        end = s[i:]
        yield [int(start), int(end)]
        for split in splitter(end):
            result = [start]
            result.extend(split)
            yield list(int(x) for x in result)

Использование:

for x in splitter(3147):
    print(x)

Выход:

[3, 147]
[3, 1, 47]
[3, 1, 4, 7]
[3, 14, 7]
[31, 47]
[31, 4, 7]
[314, 7]
1 голос
/ 31 января 2020

Короче рекурсивный подход:

def split(d):
   yield tuple(d)
   if len(d) > 1:
     yield from [b for i in range(len(d)-1) for b in split(d[:i]+[d[i]+d[i+1]]+d[i+2:])]

val = 3147
print(set(split(list(map(str, str(val))))))

Выход:

{('3', '1', '4', '7'), 
('3', '1', '47'), 
('3', '147'), 
('31', '4', '7'), 
('3147',), 
('314', '7'), 
('3', '14', '7'), 
('31', '47')}
1 голос
/ 31 января 2020

Ленивое решение без рекурсии:

import itertools

def splitter(L):
    for a in itertools.product([0,1], repeat=len(L) - 1):
        a = (0,) + a
        yield [''.join(map(lambda x: x[0], g)) 
               for _, g in itertools.groupby(zip(L, a), key=lambda x: x[1])]

L = ['3','1','4','7']
for l in splitter(L):
    print(l)

Вывод:

['3147']
['314', '7']
['31', '4', '7']
['31', '47']
['3', '1', '47']
['3', '1', '4', '7']
['3', '14', '7']
['3', '147']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...