Заменить часть строки, если она присутствует в списке (Python) - PullRequest
0 голосов
/ 25 июня 2018

Я хочу заменить часть строки на пустую, если она присутствует в списке.

Например:

Список

foo = ['.com', '.net', '.co', '.in']

Преобразовать эти строки в

google.com   
google.co.in 
google.net   
google.com/gmail/   

Эти строки

google  
google  
google  
google/gmail/

Пока я нашел это решение.Есть ли другой оптимизированный способ сделать это?
заменить элемент в строке, если он соответствует элементу в списке

Ответы [ 5 ]

0 голосов
/ 25 июня 2018

Другой альтернативой является использование str.replace() и str.find().

foo = ['.com', '.net', '.co', '.in']
domains = ["google.com", "google.co.in", "google.net", "google.com/gmail/"]

def remove_extensions(domain, extensions):
    for ext in extensions:
        if domain.find(ext) != -1:
            domain = domain.replace(ext, "")
    return domain

list(map(lambda x: remove_extensions(x, foo), domains))

Этот фрагмент кода выводит результат, как и ожидалось:

['google', 'google', 'google', 'google/gmail/']
0 голосов
/ 25 июня 2018

Вы можете использовать re.sub и str.join:

import re
foo = ['.com', '.net', '.co', '.in']
urls = ["google.com","google.co.in","google.net","google.com/gmail/"]
final_result = [re.sub('|'.join(foo), '', i) for i in urls]

Выход:

['google', 'google', 'google', 'google/gmail/']
0 голосов
/ 25 июня 2018

Используя предложение Джорджа Шуклина, это самый простой код, который я мог придумать.


import re

domains = ['.com', '.net', '.co', '.in']

urls = ["google.com","google.co.in","google.net","google.com/gmail/"]

for i in range(len(urls)):
    for domain in domains:
        urls[i] = re.sub(domain,"",urls[i])

print(urls)

Это выводит:

['google', 'google', 'google', 'google/gmail/']
0 голосов
/ 25 июня 2018

Аналогично ответу Джорджа Шулькина.

import re
suffixes = ['.com', '.co', '.in', '.net']
patterns = [re.compile(suffix) for suffix in suffixes]

def remove_suffixes(s: str) -> str:
    for pattern in patterns:
        s = pattern.sub("", s)
    return s

# urls = ["google.com", ...
clean_urls = map(remove_suffixes, urls)
# or clean_urls = [remove_suffixes(url) for url in urls]

Возможно, вы захотите использовать понимание списка, поскольку во многих случаях оно может быть быстрее, чем map.

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

Или если вы решили использовать functools.reduce,

from functools import reduce

def remove_suffixes(s: str) -> str:
    return reduce(lambda s, pattern: pattern.sub("", s), patterns, s) 
0 голосов
/ 25 июня 2018

Вам нужно разделить эту задачу на две части:

  1. Написать код для замены строки новой строкой, если она соответствует.
  2. Применить эту функцию к списку.

Сначала можно выполнить регулярное выражение (см. Ниже).Второе можно сделать с помощью функции map.

Пример кода для замены подстроки:

>>> import re
>>> re.sub(".com", "",  "google.com/gmail/")
'google/gmail/'

Пример использования функции map:

>>> map(lambda x: len(x), ["one", "two", "three"])
[3, 3, 5]

(он заменяет элементы массива длиной этих элементов).

Вы можете объединить эти два, чтобы получить то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...