2014-02-27 3 views
2

나는 a = [('b', 1), ('k', 3), ('g', 2), ('p' ...] 첫 번째 튜플은 문자이고 두 번째 문자는 얼마나 자주 문자가 발생했는지를 나타냅니다. 편지의 최대 어커런스 (k = 3 및 p = 3 이상일 수 있음)를 찾고 'a'에 가장 가까운 문자를 반환하려고합니다.복합리스트에서 최대 값을 찾는 것 - 파이썬

현재 논리 : 가장 높은 카운트 찾기 -> 다른 목록을 만들고 두 번째 튜플 = 최고 카운트 -> 목록 정렬 -> 첫 번째 요소의 첫 번째 튜플을 반환하는 요소 만 추가하십시오.

파이썬에서이 작업을 수행하는 더 좋은 방법이 있다면 (그리고 내가있을 것이라고 확신합니다) 나는 모든 귀입니다!

그러나 파이썬에서는 가장 높은 수를 찾는 가장 효율적인 방법은 무엇입니까?

현재 아래 메서드를 사용하고 있지만 숫자가 아닌 목록 요소를 반환합니다.

max(a, key=operator.itemgetter(1))

+0

오 a '는 문자열입니다. 즉, a = 'kasdf asdlkj asdlkj fsdd' – Mazzone

+0

'max (a, key = operator.itemgetter (1)) [1]'은 숫자를 반환합니다 ... – isedev

+2

왜 카운터를 사용하지 않습니까? – njzk2

답변

4

그냥 일종의 반전 수와 문자 2 튜플로 키 목록은 :

>>> a = [('b', 1), ('k',3), ('g',2), ('p',3)] 
>>> sorted(a, key=lambda t:(-t[1], t[0])) 
[('k', 3), ('p', 3), ('g', 2), ('b', 1)] 

또는 동일한 키를 min를 사용

>>> min(a, key=lambda t:(-t[1],t[0])) 
('k', 3) 
+0

그냥 날 때렸어. – njzk2

+2

정말 코드를 싫어하는 것만으로도 설명이 없습니다. – amit

+0

그것은 또한 최대를 찾고있을 때 과분 할 것 같은데. – amit

0

을 가끔 말 때문에 계산식을 사용하면 계산이 간단하고 빠르기 때문에 먼저 계산을 수행합니다.

a = [('b', 1), ('k',3), ('g',2), ('p',3)] 
max_count = max(count for (letter, count) in a) 
print max_count 

==>

3 당신은 정말 문자에 대한 치료를했다, 또는 일반적으로, 튜플의 요소 중 하나 이상에 대해 걱정하는 경우?

파이썬은 첫 번째 요소로 튜플을 정렬 (또는 비교) 한 다음 첫 번째 요소가 동일하면 두 번째 요소로 정렬하고 비교합니다. 가장 높은 수와 가장 빠른 (가장 낮은) 문자열을 가진 튜플을 원한다. 당신은 당신이 거기를 제외하고

(count, backwards-sorting-letter??) 

의 최대이었다 생각 정렬 기준 또는하여 비교하고 싶은 일을, 제공 키 = 기능 최대의(), 분() 또는 분류()를 사용할 수 있습니다 주어진 문자열과 정반대의 방식으로 정렬하는 문자열을 만드는 간단한 방법이 아닙니다. 그러나 최대 값 대신에 다음의 최소값을 찾으십시오.

(-count, letter) 

ndpu의 기능은 다음과 같습니다. (letter, count)(-count, letter)으로 바꾸려면 기능이 필요합니다. 또는 a_tuple(-a_tuple[1], a_tuple[0])으로 바꾸십시오.

당신이 할 수있는 그런

def the_order_I_want(a_tuple): 
    return (-a_tuple[1], a_tuple[0]) 

print min(a, key=the_order_I_want) 

=>('k', 3)

또는 당신은 지금 당장 뭔가 반환하는 함수 작성 단지 단축 방법입니다 람다 식을 사용할 수 있습니다

print min(a, key=lambda a_tuple: (-a_tuple[1], a_tuple[0])) 

=>('k', 3)

S 오 지금 당신은 승리 튜플을 가지고,하지만 당신은 그 자체로 카운트를 ... 원한다면 당신이 당신이 '수락 할 수있는 다른 방법을 사용하여 응답하려고도 경우

result_tuple = min(a, key=lambda t: (-t[1], t[0])) 
count = result_tuple[1] 

또는

letter, count = min(a, key=lambda t: (-t[1], t[0])) 
관련 문제