Я пытаюсь удалить начальные запятые в предложении, и я не могу понять, почему это не работает

text = ",greetings   friends"

text_l = text.split()
for word in text_l:
    if word.startswith(','):
        word = word[1:]
text = ' '.join(text_l)

>>> ,greetings friends

Но это делает.

text = ",greetings   friends"

text_l = text.split()
for word in text_l:
    if word.startswith(','):
        indw = text_l.index(word)
        text_l[indw] = word[1:]
text = ' '.join(text_l)

>>> greetings friends
-1
Константин Писаный 29 Июн 2019 в 11:38

3 ответа

Лучший ответ

Переменные в Python не работают как указатели, см. этот вопрос SO для лучшее объяснение. В своем первом фрагменте кода вы изменяете значение переменной word, а не объект, на который ссылается слово, поэтому ваш цикл ничего не меняет в исходном списке слов.

Вторые коды действительно изменяют исходный список.

Как совет, более питонический способ сделать то, что вам нужно:

original_text = ",greetings   friends"

text = ' '.join(part.lstrip(',') for part in original_text.split())
text = ' '.join(map(lambda part: part.lstrip(','), original_text.split()))  # If you want a colleague to ask you "what's that???" :)
1
Hrabal 29 Июн 2019 в 09:03

Ваш первый код не работает, потому что он только назначает новое значение локальной переменной word, без: , изменяя строку в списке. Ваш второй код работает (как вы заметили), но неэффективен, так как вы должны найти index каждого слова, которое вы хотите удалить. Вместо этого вы можете использовать enumerate для одновременной итерации слов и индексов, а также использовать lstrip вместо разбиения строки.

text_l = text.split()
for i, word in enumerate(text_l):
    if word.startswith(','):
        text_l[i] = word.lstrip(",")
text = ' '.join(text_l)

Кроме того, при использовании lstrip if больше не требуется, и мы можем сжать все это до выражения генератора одной строки внутри ' '.join(...):

text = ' '.join(word.lstrip(",") for word in text.split())
1
tobias_k 29 Июн 2019 в 08:50

Если вы хотите удалить начальную запятую, то lstrip - это желаемая команда.

text = ",greetings   friends"

text_l = text.split()
text = []
for word in text_l:
    if word.startswith(','):
        word = word.lstrip(',')
    text.append(word)
text = ' '.join(text)

Вывод текста:

greetings friends
0
Bryce Wayne 29 Июн 2019 в 08:44