반응형
목록에서 문자열 값 찾기 및 바꾸기
나는 이 목록을 받았습니다.
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
반응형
'bestsource' 카테고리의 다른 글
mongoid에서 embeds_many와 has_many의 차이 (0) | 2023.05.14 |
---|---|
WPF 탭 항목 머리글 스타일 (0) | 2023.05.14 |
Xcode 4에서 탭을 빠르게 전환하는 방법은 무엇입니까? (0) | 2023.05.14 |
git pull과 git fetch + git rebase의 차이점은 무엇입니까? (0) | 2023.05.14 |
구성된 파일 'main/binary-i386/Packages' 획득 건너뛰기 (0) | 2023.05.14 |