Как вывести в одну строчку?
X = (
'A very looooooong wooooord',
'Loremia ipsumia dolaria sitia ameti',
'Have you ever been to Lituania ?',
'Anyone who reads Old and Middle',
'English literary texts will be familiar',
'with the mid-brown volumes of the EETS,',
'with the symbol of Alfreds jewel embossed on the front cover+'
)
for i in X:
i = i.split()
for z in i:
if len(z) > 6:
z = z[0:6] + "*"
print(z)
Длинные слова нужно обрезать и поставить * в конце слова, print(z) выводит всё как надо, только по слову в каждую новую строчку, как сделать так, что бы выводило на примере X?
Ответы (3 шт):
Вот полный код:
X = (
'A very looooooong wooooord',
'Loremia ipsumia dolaria sitia ameti',
'Have you ever been to Lituania ?',
'Anyone who reads Old and Middle',
'English literary texts will be familiar',
'with the mid-brown volumes of the EETS,',
'with the symbol of Alfreds jewel embossed on the front cover+'
)
for i in X:
i = i.split()
for z in i:
if len(z) > 6: z = z[0:6] + "*"
print(z, end=' ')
print()
X = (
'A very looooooong wooooord',
'Loremia ipsumia dolaria sitia ameti',
'Have you ever been to Lituania ?',
'Anyone who reads Old and Middle',
'English literary texts will be familiar',
'with the mid-brown volumes of the EETS,',
'with the symbol of Alfreds jewel embossed on the front cover+'
)
[print(*[(z[0:6] + "*") if len(z) > 6 else z for z in i.split()], sep='\n') for i in X]
можно чуть покороче
[print(*[(z, z[:6] + "*")[len(z) > 6] for z in i.split()], sep='\n') for i in X]
или так:
[print(*[(z, f"{z[:6]}*")[len(z) > 6] for z in i.split()], sep='\n') for i in X]
Ой, не правильно понял задачу - надо было САМ ВЫВОД сделать в одну строчку :)
тогда так:
[print(*[(z, z[:6] + "*")[len(z) > 6] for z in i.split()], sep=' ', end=' ') for i in X]
в общем в print() необходимо end=' ' добавить
а можно обойтись и без атрибутов для print():
print(' '.join(' '.join((z, z[:6] + "*")[len(z) > 6] for z in i.split()) for i in X))
а вот самый короткий вариант решения:
print(' '.join((z, z[:6] + "*")[len(z) > 6] for z in ' '.join(X).split()))
хотя нет, вот еще короче:
print(' '.join(z[:6] + "*" * (len(z) > 6) for z in ' '.join(X).split()))
P.S.
украл код у @GrAnd - решение через регулярки:
print(re.sub(r"\b([-\w]{6})\w+\b",r"\1*", ' '.join(X)))
Можно использовать регулярное выражение. В таком случае можно добиться, чтобы у длинных слов не обрезались знаки препинания, например.
import re
result = tuple(re.sub(r"\b([-\w]{6})\w+\b",r"\1*",line) for line in X)
print(*result, sep="\n")
Регулярное выражение r"\b([-\w]{6})\w+\b" означает:
\b граница слова;
( ) группирует выражение и возвращает найденный текст;
[..] один из символов в скобках ([^..] — любой символ, кроме тех, что в скобках);
- задает один символ, который не должен быть в скобках;
\w любая цифра или буква (\W — все, кроме буквы или цифры);
{6} указывается число повторений предыдущего символа;
+ 1 и более вхождений шаблона слева
То есть, взять отдельное слово; выделить в нем первые 6 символов, причем один может быть не буквой и не цифрой; выделенную группу не трогать, остальное для замены; так для каждого слова.
Регулярное выражение r"\1*" означает:
экранируем символ * одна штука, так как * это 0 и более вхождений шаблона слева
re.sub(pattern, repl, string), где: pattern - искомый шаблон; repl - подстрока замены; string - обрабатываемая строка;
Ищет шаблон в строке и заменяет его на указанную подстроку. Если шаблон не найден, строка остается неизменной.