Попытка понять ''.join(), взяв список в понимании списка

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)

Откуда вы берете punctuation в обоих примерах?

nathancy 09.04.2019 04:19

@nathancy Наверное string.punctuation.

iz_ 09.04.2019 04:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы должны составить список и сохранить в нем значение, используя 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']

Это не выводит то же самое, что и исходный код. Кроме того, почему вы присоединяетесь к единственному персонажу?

iz_ 09.04.2019 04:23

Спасибо за редактирование, но теперь это менее эффективная версия моего ответа... :)

iz_ 09.04.2019 04:25

@Tomothy32 Теперь лучше

U12-Forward 09.04.2019 04:26

Добавление к строкам по-прежнему происходит довольно медленно, потому что строки неизменяемы. В любом случае, это не имеет большого значения в этом случае использования.

iz_ 09.04.2019 04:27
Ответ принят как подходящий

Вы не можете точно воспроизвести аргумент генератора 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 на самом деле не создаются.

Другие вопросы по теме