Кто-либо может обеспечить больше pythonic способа генерировать последовательность morris?

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

let scriptRegex = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
let styleRegex = /((<style>)|(<style type=.+))((\s+)|(\S+)|(\r+)|(\n+))(.+)((\s+)|(\S+)|(\r+)|(\n+))(<\/style>)/g;

// An example html content
const str = `
my cool html content
<style>
...
</style>
my cool html content
<style type="text/css">
...
</style>
my cool html content
<script> 
... 
</script>
my cool html content`;

// Strip the tags from the html
let result = str.replace(scriptRegex, '');
result = result.replace(styleRegex, '');

// There you go :)
console.log('Substitution result: ', result);

Надеюсь, это поможет!

5
задан rz. 16 February 2009 в 18:52
поделиться

2 ответа

itertools.groupby кажется, соответствует отлично! Просто определите a next_morris функция следующим образом:

def next_morris(number):
    return ''.join('%s%s' % (len(list(group)), digit)
                   for digit, group in itertools.groupby(str(number)))

Это все!!! Взгляд:

print next_morris(1)
11
print next_morris(111221)
312211

Я мог использовать это для создания генератора:

def morris_generator(maxlen, start=1):
    num = str(start)
    while len(num) < maxlen:
        yield int(num)
        num = next_morris(num)

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

for n in morris_generator(10):
    print n

результаты:

1
11
21
1211
111221
312211
13112221
24
ответ дан 18 December 2019 в 05:44
поделиться
from itertools import groupby, islice

def morris():
    morris = '1'
    yield morris
    while True:
        morris = groupby(morris)
        morris = ((len(list(group)), key) for key, group in morris)
        morris = ((str(l), k) for l, k in morris)
        morris = ''.join(''.join(t) for t in morris)
        yield morris

print list(islice(morris(), 10))

В первую очередь, я сделал бы итератор бесконечным и позволять потребителю решить, сколько из него он хочет. Тем путем он мог или получить каждое morris число, которое короче, чем x или первые x числа и т.д.

Затем нет, очевидно, никакой потребности сохранить целый список предыдущих morris чисел в списке, так как рекурсия только n := f(n-1) так или иначе.

Наконец, с помощью itertools, чтобы дать ему функциональное касание всегда стоит точки фаната или два ;) Я разделил выражение генератора на несколько строк для создания этого немного более симпатичным.

Основное уродство в этом решении прибывает из факта это len() не может быть назван на итераторе и дает нам интервал, где нам нужна ул. Другое отклонение является вложенным str.join) сглаживать все это в ул. снова.

Если Вы хотите запустить последовательность с произвольных чисел, определите функцию как это:

def morris(morris=None):
    if morris is None:
        morris = '1'
[...]

Если Вы хотите изменить к лучшему тот генератор, можно записать это как это:

def morris():
    morris = '1'
    yield morris
    while True:
        print morris
        morris = ''.join(''.join(t) 
                     for t in ((str(len(list(group))), key) 
                        for key, group in groupby(morris)))
        yield morris

Я не уверен, что мне нравится разделение на две функции, но это, кажется, самое читаемое решение:

def m_groupby(s):
    for key, group in groupby(s):
        yield str(len(list(group)))
        yield key

def morris():
    morris = '1'
    yield morris
    while True:
        morris = ''.join(m_groupby(morris))
        yield morris

Надеюсь, что Вам нравится он!

6
ответ дан 18 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: