bestsource

목록에서 문자열 값 찾기 및 바꾸기

bestsource 2023. 5. 14. 10:48
반응형

목록에서 문자열 값 찾기 및 바꾸기

나는 이 목록을 받았습니다.

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

제가 원하는 것은 교체하는 것입니다.[br]와 비슷한 환상적인 가치를 가진<br />따라서 새 목록을 가져옵니다.

words = ['how', 'much', 'is<br />', 'the', 'fish<br />', 'no', 'really']
words = [w.replace('[br]', '<br />') for w in words]

이것을 목록 이해라고 합니다.

예를 들어 다음을 사용할 수 있습니다.

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

목록 이해 외에도 지도를 시도할 수 있습니다.

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

다양한 접근 방식의 성능에 대해 궁금할 경우 다음과 같은 몇 가지 타이밍이 있습니다.

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(예:9-10)가 더 빨라질 수 있습니다.그것은 정말로 당신의 문제와 reg-exp의 가장 짧은 부분에 달려 있습니다.

for 루프의 예(나는 List Comprehensions를 선호합니다).

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']

성능이 중요한 경우를 포함하여if-else절은 성능을 향상시킵니다(100만 문자열 목록의 경우 약 5% 향상, 실제로 무시할 수 있는 수준은 아닙니다).

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

map()호출을 통해 구현을 개선할 수 있습니다.replace경유로operator.methodcaller()(약 20%) 그러나 여전히 목록 이해보다 느립니다(파이썬 3.9 기준).

from operator import methodcaller
list(map(methodcaller('replace', '[br]', '<br />'), words))

인플레이스에서 문자열을 수정하기에 충분하다면 루프 구현이 가장 빠를 수 있습니다.

for i, w in enumerate(words):
    if '[br]' in w:
        words[i] = w.replace('[br]', '<br />')

언급URL : https://stackoverflow.com/questions/3136689/find-and-replace-string-values-in-list

반응형