Есть ли лучший способ написать понимание списка? - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь удалить пробел и 'the' из имени исполнителя. Но мое понимание списка не читается.

Есть ли лучший способ написать это понимание списка, или я просто использую classi c для l oop?

 new_list= [artist.lower().replace(' ','') if artist[0:3] != 'the' else artist.lower().replace(' ','')[3:] for artist in artist_list]

Ответы [ 3 ]

2 голосов
/ 30 января 2020

Все еще не незаконно вытащить свои хитрые биты в функцию:

def cleanup(artist):
    artist = artist.lower().replace(' ', '')
    if artist.startswith('the'):
        artist = artist[3:]
    return artist


new_list = [cleanup(artist) for artist in artist_list]

Это имеет большие преимущества (на мой взгляд), что вы можете тестировать и отлаживать части по отдельности, и что это очень ясно что делает каждый шаг.

Кстати, вы захотите протестировать и отладить эту часть очистки сразу же, поскольку этот подход сделает странные вещи для Они могут быть гигантами.

2 голосов
/ 30 января 2020

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

При этом выражение можно упростить с помощью применение str.replace () для удаления «без» без теста ( replace молчит, если нет замен):

>>> s = 'The Artist Formerly Known as Prince'
>>> s.lower().replace('the ', '').replace(' ', '')
'artistformerlyknownasprince'

В качестве альтернативы, все Процесс может быть проще и гибче с регулярным выражением:

>>> re.sub(r'(^the)|\s', '', s.lower())
'artistformerlyknownasprince'
0 голосов
/ 30 января 2020

Вы можете объединить понимание с регулярным выражением:

import re
new_list = [re.sub("^the ", "", artist.lower()).replace(" ", "") for artist in artist_list]
...