Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Как перемножить списки в Python 3.x

#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)

Комментариев нет:

Отправить комментарий