Попытка понять '' .join (), берущий список в понимании списка - PullRequest
1 голос
/ 09 апреля 2019
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)

Ответы [ 3 ]

3 голосов
/ 09 апреля 2019

Вы не можете точно воспроизвести аргумент генератора 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']
1 голос
/ 09 апреля 2019

Само понимание списка можно напрямую перевести на следующее:

_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 фактически не создаются.

0 голосов
/ 09 апреля 2019

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