#python #python_3x #списки
Имеется текстовый файл с данным содержанием "D11i14V17A8n7R11H16r18P18E5h18i18x8O16Y5s13d1X6u4a20C2p2O14J5I11L5K6y4X19n10s17h1E17Q5Z1U1K6U8E8L11n14k6".
Я написал код который разделяет буквенные значения в один список, цифровые в другой.
Как правильно перемножить данные из списка, чтобы в конечном итоге получилось D * 11
= DDDDDDDDDDD (Буква D 11 раз). Код ниже:
import re
c = []
d = []
result = 0
with open('dest.txt', 'r') as s:
for line in s:
line = line.strip()
lst = re.split('(\d*)', line)
for i in lst:
if i.isalpha() == True:
c.append(i)
else:
d.append(i)
for a, b in zip(c, d):
result += a*b
print(result)
Результат:
D:\Python\lib\re.py:212: FutureWarning: split() requires a non-empty pattern match.
return _compile(pattern, flags).split(string, maxsplit)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
16
17 for a, b in zip(c, d):
---> 18 result += a*b
19
20 print(result)
TypeError: can't multiply sequence by non-int of type 'str'
Ответы
Ответ 1
In [20]: import re In [21]: task = "D11i14V17A8n7R11H16r18P18E5h18i18x8O16Y5s13d1X6u4a20C2p2O14J5I11L5K6y4X19n10s17h1E17Q5Z1U1K6 ...: U8E8L11n14k6" In [22]: numbers, lit = list(re.findall(r'\d+', task)), list(re.findall(r'\D', task)) In [23]: ''.join(int(x) * y for x, y in zip(numbers, lit)) Результат: Out[25]: 'DDDDDDDDDDDiiiiiiiiiiiiiiVVVVVVVVVVVVVVVVVAAAAAAAAnnnnnnnRRRRRRRRRRRHHHHHHHHHHHHHHHHrrrrrrrrrrrrrrrrrrPPPPPPPPPPPPPPPPPPEEEEEhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiixxxxxxxxOOOOOOOOOOOOOOOOYYYYYsssssssssssssdXXXXXXuuuuaaaaaaaaaaaaaaaaaaaaCCppOOOOOOOOOOOOOOJJJJJIIIIIIIIIIILLLLLKKKKKKyyyyXXXXXXXXXXXXXXXXXXXnnnnnnnnnnssssssssssssssssshEEEEEEEEEEEEEEEEEQQQQQZUKKKKKKUUUUUUUUEEEEEEEELLLLLLLLLLLnnnnnnnnnnnnnnkkkkkk'Ответ 2
Чтобы распаковать файл/обратить кодирование длин серий (RLE), удобно использовать re.split(), чтобы отделить символы от цифр, и zip(), чтобы попарно их обойти: import re from pathlib import Path rle_tokens = iter(re.split(r'(\d+)', Path('rle.txt').read_text())) decompressed = ''.join([char * int(digits) for char, digits in zip(rle_tokens, rle_tokens)]) print(decompressed) Объяснение как zip(it, it) работает. Результат: DDDDDDDDDDDiiiiiiiiiiiiiiVVVVVVVVVVVVVVVVVAAAAAAAA...Ответ 3
Вот так переделал код. Надо было присвоить result пустую строку. import re c = [] d = [] result = '' with open('dest.txt', 'r') as s: for line in s: line = line.strip() lst = re.split('(\d+)', line) for i in lst: if i.isalpha() == True: c.append(i) else: d.append(i) for a, b in zip(c, d): str(a) * int(b) result += str(a) * int(b) print(result)
Комментариев нет:
Отправить комментарий