2

Задача состоит в том, что при получении строки типа: a3d4c1, в файл вывести строку: aaaddddс. Цифра соответствует количеству повторений символа. Есть код следующего содержания:

with open("file.txt", 'r') as file:
    istr = file.readline().strip()

buf = ''
temp = ''
out = open("out.txt", 'w')
for i in istr:
    if i.isdigit():
        #print(type(buf), type(i))
        buf += i
    if i.isalpha() and buf != '':
        out.write(temp*int(buf))
        temp = i
        buf = 0
out.close()

Python выдаёт ошибку unsupported operand type(s) for +=: 'int' and 'str' на строке buf +=i при этом если убрать комментарий с print(type(buf), type(i)), то выдаёт, что оба str. В чём ошибка?

MaxU - stand with Ukraine
  • 149,321
  • 12
  • 59
  • 132
Totem
  • 437
  • 1
    Но вы же сами создали число buf = 0, вот на второй итерации и падает – andreymal Mar 23 '18 at 11:19
  • 1
    ''.join([v * int(s[i * 2 + 1]) for i, v in enumerate(s[::2])]) – slippyk Mar 23 '18 at 11:24
  • 1
    Питон может преобразовывать типы в ходе выполнения программы. В данном случае он ошибочно считает что при сложении += пустую строку нужно преобразовать в 0. Поэтому нужно попробовать другие варианты для сложения строк. buf=buf+i или buf=str(buf)+i или buf=buf.join(i) – coder675 Mar 23 '18 at 13:16
  • @andreymal а почему тогда на каждой из итераций если убрать коммент, пишет, что строка? – Totem Mar 23 '18 at 19:07
  • А я вам не верю что на каждой итерации пишет, покажите скриншот например? – andreymal Mar 23 '18 at 20:30
  • @andreymal https://ibb.co/d4j8vS – Totem Mar 23 '18 at 20:34
  • Ну так неинтересно, вы проблемную строку закомментировали и ошибку не воспроизвели) – andreymal Mar 23 '18 at 20:36
  • @andreymal так с ошибкой он и не собирается :D – Totem Mar 23 '18 at 20:38
  • Не собираться он будет только при invalid syntax, а с вашей ошибкой всё будет собираться и печатать как положено (и печатать именно int), но выдавать эту вот ошибку во время выполнения – andreymal Mar 23 '18 at 20:42
  • @andreymal Вы правы, ошибся, первый новый язык за долгое время изучения плюсов, заговариваюсь – Totem Mar 23 '18 at 20:44

2 Answers2

1

Такие строки удобнее парсить регулярными выражениями:

import re

s = 'a3d4c1'
print(''.join([c * int(n) for c,n in re.findall(r'([a-z])(\d)', s, flags=re.I)]))

Выдаст:

aaaddddc
MaxU - stand with Ukraine
  • 149,321
  • 12
  • 59
  • 132
1

Если комбинации символ - число неизменны, то можно так:

s = 'a3d4c1'
''.join([v * int(s[i * 2 + 1]) for i, v in enumerate(s[::2])])
# aaaddddc
slippyk
  • 6,161
  • Спасибо за предложение, только недавно начал учить язык - пригодится, но вопрос в первую очередь о динамической типизации – Totem Mar 23 '18 at 20:37