x = "some... random! text?!".split()
x = [''.join(char for char in string if char not in punctuation) for string
in x]
Я пытаюсь понять, как работает это понимание списка, реплицируя его в цикле for, но я не могу его воссоздать. Вот то, что у меня сейчас есть, но это кажется неправильным. Что я делаю неправильно в цикле for?
for string in x:
for char in string:
if char not in punctuation:
''.join(char)
@nathancy Наверное string.punctuation.






Вы должны составить список и сохранить в нем значение, используя append:
l = []
for string in x:
s = ''
for char in string:
if char not in punctuation:
s += char
l.append(s)
И сейчас:
print(l)
Является:
['some', 'random', 'text']
Это не выводит то же самое, что и исходный код. Кроме того, почему вы присоединяетесь к единственному персонажу?
Спасибо за редактирование, но теперь это менее эффективная версия моего ответа... :)
@Tomothy32 Теперь лучше
Добавление к строкам по-прежнему происходит довольно медленно, потому что строки неизменяемы. В любом случае, это не имеет большого значения в этом случае использования.
Вы не можете точно воспроизвести аргумент генератора join. Я бы использовал промежуточный список:
result = []
for string in x:
to_join = []
for char in string:
if char not in punctuation:
to_join.append(char)
result.append(''.join(to_join))
С punctuation как from string import punctuation; punctuation = set(punctuation) он выводит
['some', 'random', 'text']
Само понимание списка может быть напрямую переведено в следующее:
_result = []
for string in x:
_result.append(''.join(char for char in string if char not in punctuation))
x = _result
del _result
Конечно, промежуточных переменных нет _result. Вы используете выражение генератора внутри понимания списка, которое само по себе похоже на понимание списка, за исключением того, что оно создает генератор. Итак, что-то вроде:
def _g():
for char in string:
if char not in punctuation:
yield char
Собираем все вместе:
_result = []
for string in x:
def _g():
for char in string:
if char not in punctuation:
yield char
_result.append(''.join(_g()))
del _g
x = _result
del _result
Но опять же, промежуточные переменные _result и _g на самом деле не создаются.
Откуда вы берете
punctuationв обоих примерах?