Знайдіть і замініть рядкові значення в списку


153

Я отримав цей список:

words = ['how', 'much', 'is[br]', 'the', 'fish[br]', 'no', 'really']

Я хотів би замінити [br]якесь фантастичне значення, подібне до <br />і, таким чином, отримати новий список:

words = ['how', 'much', 'is<br />', 'the', 'fish<br />', 'no', 'really']

Відповіді:


274
words = [w.replace('[br]', '<br />') for w in words]

Вони називаються спільними розуміннями .


5
Здійснюючи порівняння між цим методом розуміння списку та методом карт (розміщений @Anthony Kong), цей метод списку був приблизно в 2 рази швидшим. Також дозволяється вставляти декілька замін у один і той же дзвінок, наприкладresname = [name.replace('DA', 'ADE').replace('DC', 'CYT').replace('DG', 'GUA').replace('DT', 'THY') for name in ncp.resname()]
Стівен К. Хоуелл

1
@sberry У мене є список, ['word STRING', 'word_count BIGINT', 'corpus STRING', 'corpus_date BIGINT']де я намагаюся замінити 'порожній, але це не працює. як ми можемо замінити це, використовуючи це?
Сандіп Сінгх

Що робити, якщо одним із елементів є float / integer?
Патріоти299

32

Ви можете використовувати, наприклад:

words = [word.replace('[br]','<br />') for word in words]

2
@macetw Фактично перша відповідь.
CodeIt

дивлячись на мітку часу, здається, вони обидва відповіли одночасно, можливо, ця запізнюється на якусь частку секунд ...
maksbd19

31

Крім розуміння списку, ви можете спробувати карту

>>> map(lambda x: str.replace(x, "[br]", "<br/>"), words)
['how', 'much', 'is<br/>', 'the', 'fish<br/>', 'no', 'really']

15

Якщо вам цікаво про ефективність різних підходів, ось кілька моментів:

In [1]: words = [str(i) for i in range(10000)]

In [2]: %timeit replaced = [w.replace('1', '<1>') for w in words]
100 loops, best of 3: 2.98 ms per loop

In [3]: %timeit replaced = map(lambda x: str.replace(x, '1', '<1>'), words)
100 loops, best of 3: 5.09 ms per loop

In [4]: %timeit replaced = map(lambda x: x.replace('1', '<1>'), words)
100 loops, best of 3: 4.39 ms per loop

In [5]: import re

In [6]: r = re.compile('1')

In [7]: %timeit replaced = [r.sub('<1>', w) for w in words]
100 loops, best of 3: 6.15 ms per loop

як ви бачите для таких простих шаблонів, прийняте розуміння списку найшвидше, але подивіться на наступне:

In [8]: %timeit replaced = [w.replace('1', '<1>').replace('324', '<324>').replace('567', '<567>') for w in words]
100 loops, best of 3: 8.25 ms per loop

In [9]: r = re.compile('(1|324|567)')

In [10]: %timeit replaced = [r.sub('<\1>', w) for w in words]
100 loops, best of 3: 7.87 ms per loop

Це показує, що для більш складних підстановок попередньо складений reg-exp (як in 9-10) може бути (набагато) швидшим. Це дійсно залежить від вашої проблеми та найкоротшої частини reg-exp.


3

Приклад з для циклу (я віддаю перевагу розумінням списку).

a, b = '[br]', '<br />'
for i, v in enumerate(words):
    if a in v:
        words[i] = v.replace(a, b)
print(words)
# ['how', 'much', 'is<br/>', 'the', 'fish<br/>', 'no', 'really']
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.