Фильтровать элементы списка по символам - PullRequest
0 голосов
/ 25 августа 2018

Привет. Я хочу отфильтровать элементы с / без -, . в два списка. Мой код не выполняет эту работу, он, кажется, проходит через все дважды и не может заменить одновременно и -, и .. Где я сделал не так?

Код:

NO_SYMBOL = []
WITH_SYMBOL = []
SPACE = []
for i in DATA:
    for ch in ['-', '.']:
        if ch in i:
            WITH_SYMBOL.append(i)
            SPACE.append(i.replace(ch, ' '))
        else:
            NO_SYMBOL.append(i)

Данные

['volunteer-abroad',
 'volunteer-abroad.com',
 'volunteer-abroad.ie',
 'volunteer-abroad.org',
 'volunteerabroad']

Мой вывод:

SPACE
['volunteer abroad',
 'volunteer abroad.com',
 'volunteer abroad.ie',
 'volunteer abroad.org',
 'volunteer-abroad com',
 'volunteer-abroad ie',
 'volunteer-abroad org']

NO_SYMBOL
['volunteer-abroad', 'volunteerabroad', 'volunteerabroad']

Я хочу получить вывод, подобный следующему:

SPACE
['volunteer abroad',
 'volunteer abroad com',
 'volunteer abroad ie',
 'volunteer abroad org']

NO_SYMBOL
['volunteerabroad']

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Вы обрабатываете эти два символа отдельно, используя цикл for:

  • Первый раз в цикле for ch in ['-', '.']:, ch установлен на '-'. Когда этот символ найден в i, вы создаете новую строку с удаленным - и добавляете ее к SPACE, а сам i добавляется к WITH_SYMBOL. Если персонаж не найден, вы добавляете к NO_SYMBOL.
  • Во второй раз в цикле ch устанавливается на '.', и вы снова выполняете ту же работу.

В результате вы всегда добавляете либо SPACE и WITH_SYMBOL, либо NO_SYMBOL дважды для каждого i.

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

for i in data:
    altered = False
    cleaned = i
    for ch in ['-', '.']:
        if ch in clean:
            altered = True
            cleaned = cleaned.replace(ch, ' ')
    if altered:
        SPACE.append(cleaned)
        WITH_SYMBOL.append(i)
    else:
        NO_SYMBOL.append(i)

Вы также можете просто проверить наличие или символа и использовать str.replace() для обоих. Это безопасно, str.replace() не волнует, если заменяемый символ отсутствует вообще:

if '-' in i or '.' in i:
    SPACE.append(i.replace('-', ' ').replace('.', ' '))
    WITH_SYMBOL.append(i)
else:
    NO_SYMBOL.append(i)

Вместо двух .replace() вызовов вы также можете использовать таблицу перевода , переданную в str.translate(); это быстрее и намного более гибко, если у вас есть переменное количество символов для замены. В последнем случае вы можете использовать функцию any() для проверки последовательности символов:

symbols = ['-', '.']  # can be extended later
translation_map = str.maketrans(dict.fromkeys(symbols, ' '))  # map any symbol to a space
for entry in data:    # entry is a nicer name here than i
    # the following loops over symbols until one is found that matches, then 
    # returns True. If no matching symbol is found, False is given instead.
    if any(ch in entry for ch in symbols):
        SPACE.append(entry.translate(translation_map))
        WITH_SYMBOL.append(entry)
    else:
        NO_SYMBOL.append(entry)
0 голосов
/ 25 августа 2018

Я думаю, что ошибка в вашем коде была найдена другими ответами - но с помощью простого RegEx вы могли бы повысить производительность и легко изменить ее, если вам нужно будет добавить новые символы для соответствия:

import re
pattern = re.compile("[-.]")
NO_SYMBOL = []
WITH_SYMBOL = []
SPACE = []

for item in data:
  if pattern.search(item):
    WITH_SYMBOL.append(item)
    SPACE.append(pattern.sub(" ", item))
  else:
    NO_SYMBOL.append(item)

Онлайн демо здесь

0 голосов
/ 25 августа 2018

Вам не нужен цикл для запуска дважды в одном и том же списке, вместо этого вы можете изменить условие if

NO_SYMBOL = []
WITH_SYMBOL = []
SPACE = []
for i in DATA:
    if '-' in i or '.' in i:
        WITH_SYMBOL.append(i)
        SPACE.append(i.replace('.', ' ').replace('-', ' '))
    else:
        NO_SYMBOL.append(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...