2012-06-24 2 views
1

목록 (통계 모드)에서 가장 일반적인 요소를 반환하려고합니다. 불행하게도 나는 all을 반복적으로 사용하는 방법을 모른다. 이것은 모든() 내가 사용하지 않는 경우에 모습입니다 : 목록에서 가장 일반적인 요소를 찾는 방법 (all() 사용)

def large(a): 
for i in set(a): 
    for j in set(a): 
     if a.count(i)<a.count(j): 
      break 
return i 

그러나 나는이 더 설득력 기록 될 수 있다는 것을 알고. 누군가는 더 웅변적인 버전을 쓸 수 있습니까? 나는 그것이의 라인을 따라 뭔가 생각 :

[i for i,j in set(a) if all(a.count(i)>a.count(j)] 

이 코드는이 문제가 있습니다. 첫째, set(a)에는 압축을 풀 때 두 번째 값이 필요하고 두 번째 값은 all입니다. 여기서 작동하지 않습니다.

도와주세요. 감사!

예 : {'a','a','b','b','b','c'} 당신이 가장 큰 요소를

+0

'모든()'반복자없는 시도 그것은 기본 제공입니다.] (http://docs.python.org/library/functions.html#all) – Makoto

+0

여러분 모두가 반복 가능한 것으로 모든 것을 사용하는 방법을 말하고자합니다. –

+0

나는 당신을 문서에 링크 시켰습니다. 페이지; 당신에게 당황 스럽네요. – Makoto

답변

2

확인을 할 'b을'기대 - 지금 당신의 질문을 이해합니다. 아래의 코드는이 문제를 일반적으로 해결하는 방법이 아닙니다. 그러나 all()이 어떻게 작동 하는지를 배우는 것은 괜찮습니다. 카운터보다 훨씬 효율적이지 않습니다. 흥미롭게도 가장 빈번한 모든 요소를 ​​반환 할 것이므로 멀티 모달 데이터의 정확한 처리가 필요할 때 유용 할 수 있습니다. 가장 좋은 방법이다 내가 생각하지 않는 - - 당신이 절대적으로 all이 작업을 수행해야하는 경우

>>> q = list("aaabbbbcc") 
>>> q 
['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c'] 
>>> r = set(q) 
>>> r 
set(['a', 'c', 'b']) 
>>> [x for x in r if all([q.count(x) >= q.count(y) for y in r])] 
['b'] 
+0

첫 번째 예제에서'all()'은 모든 것이 소문자 인 경우 true로 표시됩니다. if 문에서'all()'이 true로 나타날 수 있습니까? 그게 본질적으로 내가 뭘 기대하고 있었는지 ... 아마 나는 모든 기능을 오해하고있다. –

+0

그것은 - 내가 당신을 위해 그것을 정리해야하는 예제를 게시했습니다 :) –

+1

감사합니다 !!! 이 대답을 원했던 이유는'All()'을이 방식으로 사용했기 때문입니다. 코드 줄을 상당히 줄여서 여러 중첩 된'for' 대신에 코딩을 시작하고 싶었 기 때문입니다 루프. 다시 한 번 감사드립니다! –

1
from collections import Counter 

def most_common(a): 
    return Counter(a).most_common(1)[0][0] 

[

def most_common(a): 
    a_count = [(i, a.count(i)) for i in set(a)] 
    for i,c in a_count: 
     if all(c >= cc for ii,cc in a_count): 
      return i 
+0

고마워요.하지만 카운터를 알고 있었어요. all() 함수를 배워서 미래에 사용할 수 있습니다. –

+0

ii와 cc가 동시에 참조하는 것은 무엇입니까? (왜 두 개와 두 개가 필요한가요?) –

+0

@Chowza : 저는 이것을 "다른 i"와 "다른 c"(즉, i '와 c'를 사용할 수 없기 때문에)로 사용합니다 ;-) –

관련 문제