Умножение каждой буквы слова на заданный диапазон - PullRequest
0 голосов
/ 06 января 2020

Я хочу умножить каждую букву слова на основе заданного начального и конечного диапазона. Мой текущий код выглядит следующим образом, но он не работает должным образом:

word = ['h', 'e', 'l', 'p', 'm', 'e']
start = 3
end = 5
for b in range(start, end + 1):
    for a in word:
        print(a * b, end='')

Мой вывод:

hhheeelllpppmmmeeehhhheeeellllppppmmmmeeeehhhhheeeeelllllpppppmmmmmeeeee

Но я хочу получить:

hhheeeelllllpppmmmmeeeee

Порядок выполнения этой программы должен быть следующим:

helpme
345345

Кроме того, как можно игнорировать пробелы и цифры в списке? Например, мой ввод будет:

['h', 'e', 'l', 'p', ' ', 'm', 'e']
start = 3
end = 5

И мой вывод:

hhheeeelllllppp mmmmeeeee

, поэтому умножения должны быть:

help me
3453145

Ответы [ 4 ]

4 голосов
/ 06 января 2020

Вы можете сделать что-то вроде следующего, используя zip и itertools.cycle:

import itertools

word = ['h', 'e', 'l', 'p', 'm', 'e']
start = 3
end = 5

for a, b in zip(itertools.cycle(range(start, end + 1)), word):
    print(b*a, end = '')

Выход:

hhheeeelllllpppmmmmeeeee

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

word = ['h', 'e', 'l', 'p', 'm', 'e']
start = 3
end = 5

lst = list(range(start, end + 1))

for i, a in enumerate(word):
    print(a*lst[i%len(lst)], end='')

Чтобы игнорировать определенные символы:

import itertools

word = ['h', 'e', 'l', 'p', ' ', '1', 'm', 'e']
start = 3
end = 5

characters_to_ignore=' 0123456789'

gen = itertools.cycle(range(start, end + 1))

lst = [(x, next(gen)) if x not in characters_to_ignore else (x, 1) for x in word]

for a, b in lst:
    print(a*b, end='')

Вывод:

hhheeeelllllppp 1mmmmeeeee
3 голосов
/ 06 января 2020

Уже даны хорошие ответы. Просто хочу добавить мой, который является одним вкладышем (просто для разнообразия). В идеале вы должны использовать хорошо читаемый и разделенный код, но, как я уже сказал, это решение состоит в том, чтобы просто вывести «pythoni c разновидность», которая существует: -).

word = ['h', 'e', 'l', 'p', 'm', 'e']
print("".join(list(map(lambda a: a[0]*a[1], zip(word,list(range(3,6))*(len(word)//3))))))

Вывод такой, как показано ниже

hhheeeelllllpppmmmmeeeee

Строки добавлены позже

Редактируется после просмотра запроса списка слов с включенным в него пробелом

@ Faded I не могу придумать решение «одной линии», не разрушив проверки работоспособности без возможности ремонта. У всего есть пределы, и я достиг предела для того, чтобы создать решение «одной линии» для проблемы, которую вы описали. Это может быть только я, и у кого-то может быть очень простое решение, использующее однострочное выражение python. Мы должны подождать этого специального факелоносца.

Между тем, очень легко добиться того же с помощью многопоточной программы. Одно из многих возможных решений приведено ниже.

word = ['h', 'e', 'l', 'p', '','m', 'e']
FinalList = []
MultiplierCount = 3
for i in word:
    if len(i) != 0:
        FinalList.append(i*MultiplierCount)
        MultiplierCount += 1
        if MultiplierCount > 5:
            MultiplierCount = 3
    else:
        FinalList.append(' ')

FinalOutput = "".join(FinalList)
print(FinalOutput)

Это дает следующий вывод.

hhheeeelllllppp mmmmeeeee
3 голосов
/ 06 января 2020

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

word = "helpme"
start = 3
end = 5

r = list(range(start, end + 1))

print(''.join([l * r[i % len(r)] for i, l in enumerate(word)]))

Вывод

hhheeeelllllpppmmmmeeeee
2 голосов
/ 06 января 2020

Вы можете использовать enumerate и операторы модуля здесь:

word = ['h', 'e', 'l', 'p', 'm', 'e']
start = 3
end = 5
for i,a in enumerate(word):
    print(a * (i%(end-start+1)+start), end='')

В исходном коде происходит то, что вы перебираете целое слово 3 раза, по одному разу для каждого числа в ассортимент 3-6 эксклюзив. В этом коде мы используем индекс символьного мода 3 (конец-начало + 1), а затем добавляем 3. Таким образом, для любого заданного числа он даст нам результат 3, 4 или 5.

РЕДАКТИРОВАТЬ:

Я не могу придумать какой-либо логический способ для вас использовать вложенный для -l oop, чтобы решить эту проблему, не становясь действительно сложным без причины. Вы либо закончите итерацию по диапазону (3,6) для каждой буквы вашего слова, либо, как вы уже делаете, итерацию по каждой букве вашего слова один раз для каждого числа в диапазоне (3,6).

...