Почему этот код для списка не работает для больших записей? - PullRequest
1 голос
/ 18 июня 2020

Я пишу код для шифра и хочу преобразовать числа с одним ди git в числа с двумя ди git с 0 перед ними.

Я хочу превратить список вроде этого:

[":","2",":","3",":","4",":"]

на это:

[":", "0","2", ":", "0","3". ":", "0","4",":"]

Но я не понимаю, почему мой код не работает, когда список становится большим. Вот мой код:

text = str(input("Enter the text you want to encode: "))
text = ':' + text + ':'

n = len(text)
text = list(text)
t_test = text

for i in range(2,n):
    if text[i] == ':' and text[i-2] == ":":
        t_test.insert((i-1),"0")
t_test = text
print(text)

, например, когда я ввожу это:

1:2:3:4:5:6

, он не может вставить ноль перед 5 и 6. Он выводит это:

[':', '0', '1', ':', '0', '2', ':', '0', '3', ':', '0', '4', ':', '5', ':', '6', ':']

вместо:

[':', '0', '1', ':', '0', '2', ':', '0', '3', ':', '0', '4', ':', '0', '5', ':', '0', '6', ':']

Я пробовал использовать меньшие записи, и он работает, но я не знаю, почему в какой-то момент он начинает давать сбой.

Ответы [ 3 ]

2 голосов
/ 18 июня 2020

Если вы хотите изменить строку, возможно, лучше придерживаться строковых функций. Например, вы можете использовать регулярное выражение для поиска одиночных цифр и добавления ведущего нуля:

import re

text = '2:3:4:5:6:10:44'

t_test = re.sub(r'\b(\d)\b', r'0\1', ':' + text + ':')
print(t_test, list(t_test), sep="\n")

Вывод:

:02:03:04:05:06:10:44:
[':', '0', '2', ':', '0', '3', ':', '0', '4', ':', '0', '5', ':', '0', '6', ':', '1', '0', ':', '4', '4', ':']
0 голосов
/ 18 июня 2020

С одной стороны, опубликованный вами код не работает ни для одной записи, большой или маленькой. Вот как я использовал понимание списка для преобразования списка, как показано в вашем примере:

l = [":","2",":","3",":","4",":"]
l = [a for b in [["0",i] if i.isdigit() else [i] for i in l] for a in b]
print(l)

Вывод:

[':', '0', '2', ':', '0', '3', ':', '0', '4', ':']

Вот еще один способ:

l = [":","2",":","3",":","4",":"]
l = ' '.join([f"0 {i}" if i.isdigit() else i for i in l]).split()
print(l)

Вывод:

[':', '0', '2', ':', '0', '3', ':', '0', '4', ':']
0 голосов
/ 18 июня 2020

Другой способ, на случай, если вы не хотите использовать регулярные выражения. Здесь мы используем (в основном) только методы класса str и понимание списка.

text = '1:2:3:4:5:6'
list_ = text.split(':')
format_number = lambda x: f'0{x}' if x.isdigit() and len(x) == 1 else x
result = [* ':' + ":".join([format_number(str(x)) for x in list_]) + ':']

вывод для print(result):

[':', '0', '1', ':', '0', '2', ':', '0', '3', ':', '0', '4', ':', '0', '5', ':', '0', '6', ':']    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...