>  기사  >  백엔드 개발  >  알파벳에서 문자의 해당 위치를 얻기 위한 Python의 여러 방법 및 성능 비교

알파벳에서 문자의 해당 위치를 얻기 위한 Python의 여러 방법 및 성능 비교

高洛峰
高洛峰원래의
2016-11-22 14:32:133141검색

파이썬에서 알파벳 문자의 해당 위치를 구하는 여러 가지 방법과 성능 비교

어떤 경우에는 알파벳 문자의 순서인 A = 1, B = 2를 알아내야 합니다. , C = 3 등, 예를 들어 이 질문 https://projecteuler.net/problem=42 문제를 해결하는 단계 중 하나는 문자를 알파벳의 해당 순서로 변환하는 것입니다.

알파벳에서 문자의 해당 위치를 얻는 가장 쉬운 방법은 다음과 같습니다.

str.index 또는 str.find 방법을 사용합니다.

In [137]: "ABC".index('B')
Out[137]: 1In [138]: "ABC".index('B')+1Out[138]:
 2#或者在前面填充一个字符,这样index就直接得到字母序号:
 In [139]: "_ABC".index("B")
Out[139]: 2

I I 또한 알파벳을 목록이나 튜플로 변환한 다음 이를 인덱싱하는 방법도 생각했습니다. 성능이 향상될 수도 있습니다. 아니면 문자와 숫자로 구성된 키값을 사전에 저장해 두는 것이 좋은 방법일까요?

저는 이틀 전에도 방법을 깨달았습니다.

In [140]: ord('B')-64
Out[140]: 2

ord와 chr은 모두 Python에 내장된 함수입니다. ord는 ASCII 문자를 ASCII Serial의 해당 문자로 변환할 수 있습니다. number, chr은 일련번호를 문자열로 변환할 수 있습니다.

표의 대문자는 65부터 시작하는데, 빼기 64가 바로 표의 대문자 위치입니다. 소문자는 97부터 시작하며, 96보다 작은 문자는 해당 알파벳 위치입니다.

성능 측면에서 어떤 접근 방식이 더 나을까요? 테스트하기 위해 코드를 작성했습니다.

az = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"_az = "_ABCDEFGHIJKLMNOPQRSTUVWXYZ"azlist = list(az)

azdict = dict(zip(az,range(1,27)))

text = az*1000000 #这个是测试数据#str.find和str.index的是一样的。这里就没必要写了。def azindexstr(text):
    for r in text:
        az.index(r)+1
        passdef _azindexstr(text):
    for r in text:
        _az.index(r)        passdef azindexlist(text):
    for r in text:
        azlist.index(r)        passdef azindexdict(text):
    for r in text:
        azdict.get(r)        passdef azindexdict2(text):
    for r in text:
        azdict[r]        passdef azord(text):
    for r in text:
        ord(r)-64
        passdef azand64(text):
    for r in text:
        ord(r)%64
        pass

위 코드를 복사하여 ipython에 붙여넣은 다음 매직 함수 %timeit를 사용하여 각 메서드의 성능을 테스트합니다. ipython은 주로 텍스트에 사용되는 %timeit 함수와 같이 매우 실용적인 다양한 기능을 제공하는 Python 대화형 인터프리터입니다. pip install ipython을 입력하여 설치하세요.

다음은 제가 테스트한 결과 데이터입니다.

In [147]: %timeit azindexstr(text)
1 loop, best of 3: 9.09 s per loop

In [148]: %timeit _azindexstr(text)
1 loop, best of 3: 8.1 s per loop

In [149]: %timeit azindexlist(text)
1 loop, best of 3: 17.1 s per loop

In [150]: %timeit azindexdict(text)
1 loop, best of 3: 4.54 s per loop

In [151]: %timeit azindexdict2(text)
1 loop, best of 3: 1.99 s per loop

In [152]: %timeit azord(text)
1 loop, best of 3: 2.94 s per loop

In [153]: %timeit azand64(text)
1 loop, best of 3: 4.56 s per loop

결과를 보면 list.index가 가장 느린 것을 알 수 있습니다. 나. 또한 목록에 데이터가 많으면 인덱스 속도가 매우 느려집니다. dict[r]의 속도는 dict.get(r)보다 빠르지만 키가 존재하지 않는 경우 dict[r]은 오류를 보고하고 dict.get 메서드는 오류를 보고하지 않으며 내결함성이 더 좋습니다.

ord(r)-64 방법은 속도가 빠르고 데이터를 구성할 필요가 없기 때문에 사용하기 가장 편리합니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.