2012-10-17 4 views
4

왜 파이썬주고 출력 플로트 : 그것은 모두 cases.right에 대한 진정한해야파이썬 문자열 다른 경우와 비교하여이 같은

>>> 'apple' > 'T' 
True 
>>> 'apple' > 't' 
False 

?

편집 :

나는 ASCII의 Table.Thanks의 아이디어를 얻었다!

이제 어떻게됩니까? 11.1은 '11 .1 '로 취급됩니까?

>>> 'apple' > 11.1 
True 
+0

일부 데이터가 예상대로 정렬되지 않았기 때문에이를 묻는 중입니까? 그렇다면 대소 문자가 정규화되도록 정렬 함수에 키를 전달할 수 있습니다 :'my_strings.sort (key = str.upper)'. –

+0

내가 편집 한 질문에 대한 간단한 대답을 포함하도록 내 대답을 편집했습니다. 어떻게 전환에 관한 질문이 더 있으면, 제가 제공 한 링크를 읽고 새로운 SO 질문이 있으면 그것을 시작하는 것이 좋습니다. – Wilduck

답변

6

여기서 중요한 통찰력은 문자열 비교입니다 알파벳 순서 또는 임의의 자연 순서에 따라 비교하는 것이 아니라 ASCII 문자 순서에 따라 비교합니다. ASCII table에서이 주문을 볼 수 있습니다.

파이썬은 각 문자열의 첫 번째 문자를 비교하고 동일하면 다음 문자로 넘어갑니다. 문자가 달라 지거나 하나의 문자열이 다 떨어질 때까지이 작업을 수행합니다 (이 경우 긴 문자열은 더 큰 것으로 간주됩니다). cdhowie가 T 84 진수 ASCII 인코딩에서 지적

, a 97이고 t 따라서 116이다

>>> "apple" > "a" 
True 

다음과

>>> 'T' < 'a' < 't' 
True 

는 번째 시점을 표시하려면 더 자연스러운 비교를 참조하십시오 : Does Python have a built in function for string natural sort?

편집에서 추가 한 질문에 대답하려면 :

간단한 대답은 "예"입니다. 11.1에서 '11.1'으로의 변환이 수행되고 있습니다.

더 복잡한 대답은 정확하게 비교가 파이썬에서 구현되는 방법을 다룹니다. Python 객체가 Comparison magic methods을 구현하면 비교할 수 있습니다. 저 링크에서 파이썬 내부에 ​​대해 할 수있는 상당한 양의 독서가 있습니다.

@glibdup에서 지적했듯이 위의 내용은 잘못되었습니다. 파이썬에서 다른 유형은 compared based on the name of their type입니다. 따라서 'str' > 'float'부터 모든 문자열은 모든 float보다 커야합니다. 또는 임의의 튜플이 임의의 문자열보다 커야합니다.

+0

연결된 질문에서 OP는 문자열 내부의 숫자를 숫자로 해석하여 'example22'가 ''example7 ''다음에 정렬되도록합니다. 나는 그것이 여기에 관련이 있다고 생각하지 않는다. –

+1

@StevenRumbalski True이면 충분합니다. 나는 그 링크를 포함하는 것에 대한 나의 요점이 OP가 무엇을 찾을 수 있는지에 대한 이름을 더 암시하는 것이라고 생각한다. 이것이 실제로 문제가된다면 학계의 호기심에 대한 문제뿐만 아니라 OP가 해결해야 할 필요가있는 "자연적 분류"라는 문구를 아는 것이 좋은 시작일 것입니다. 제프 앳 우드 (Jeff Atwood)는이 문제에 관해 꽤 괜찮은 글을 남겼습니다. (대다수의 사람들이 여전히 숫자를 다루고 있습니다.) http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html . – Wilduck

+2

충분합니다. 대부분의 경우,'my_list.sort (key = str.upper)'는 아마 충분히 기대에 부응 할 것이다. –

8

a는 ASCII 문자 세트 T 뒤에 오는 있기 때문에,하지만 t 전에.

이 편지의 진수 ASCII 인코딩 :

  • T가 84
  • a이다가 97
  • t입니다 (116)