2013-05-06 4 views
2

파이썬에서 각 키의 고유 값을 세는 데 문제가 있습니다.고유 값의 파이썬 사전 개수

은 내가 개별적으로 각 키마다 고유 값의 수를 인쇄해야

[{"abc":"movies"}, {"abc": "sports"}, {"abc": "music"}, {"xyz": "music"}, {"pqr":"music"}, {"pqr":"movies"},{"pqr":"sports"}, {"pqr":"news"}, {"pqr":"sports"}] 

같은 사전 D가있다. 내가

abc 3 
xyz 1 
pqr 4 

이 도와주세요 인쇄 할 것이다 의미

.

함께 일부 체인으로, 당신은

+2

를? 아니면 잘못 재생됩니까? – thegrinner

+1

그건 사전이 아니에요. 그게 기껏해야 사전 목록입니다. 하나의 키/값 쌍만 포함되어 있습니다. 정말요? 어떤 종류의 데이터 구조입니까? 그리고 저는 실제로 그것이''{abc ":"영화 "}라고 생각합니다, 맞습니까? –

+0

@TimPietzcker 그게 전부입니다. 표현의 실수로 죄송합니다 – user1189851

답변

7

collections.Counter() instance를 사용하여 감사 :

이 당신의 입력 목록에서 하나 이상의 키 사전이 제대로 계산되도록
from collections import Counter 
from itertools import chain 

counts = Counter(chain.from_iterable(e.keys() for e in d)) 

.

데모 :

>>> from collections import Counter 
>>> from itertools import chain 
>>> d = [{"abc":"movies"}, {"abc": "sports"}, {"abc": "music"}, {"xyz": "music"}, {"pqr":"music"}, {"pqr":"movies"},{"pqr":"sports"}, {"pqr":"news"}, {"pqr":"sports"}] 
>>> Counter(chain.from_iterable(e.keys() for e in d))Counter({'pqr': 5, 'abc': 3, 'xyz': 1}) 

또는 입력 사전에 여러 키

:

>>> d = [{"abc":"movies", 'xyz': 'music', 'pqr': 'music'}, {"abc": "sports", 'pqr': 'movies'}, {"abc": "music", 'pqr': 'sports'}, {"pqr":"news"}, {"pqr":"sports"}] 
>>> Counter(chain.from_iterable(e.keys() for e in d))                    Counter({'pqr': 5, 'abc': 3, 'xyz': 1}) 

Counter()은 분류 역의 요소와 그 수를 나열 .most_common() method 등의 추가 도움이 기능을 가지고 있습니다 주문 :

for key, count in counts.most_common(): 
    print '{}: {}'.format(key, count) 

# prints 
# 5: pqr 
# 3: abc 
# 1: xyz 
+0

[ Counter] (http://docs.python.org/2/library/collections.html#collections.Counter) 클래스가 Python 2.7에서 도입되었습니다. [백 포트] (http://code.activestate.com/recipes/576611-counter-class/)가 있습니다. 나는 당신이 [그것에 대해] 알았다고 생각한다 (http://stackoverflow.com/a/13311111/566644), Martijn. –

+0

@ LauritzV.Thaulow : 달리 [2.5 및 2.6 용 백 포트] (http://code.activestate.com/recipes/576611-counter-class/)로 제공됩니다. –

+0

... 또는'int'와 함께'defaultdict'를 사용할 수 있습니다. –

2
>>> d = [{"abc":"movies"}, {"abc": "sports"}, {"abc": "music"}, {"xyz": "music"}, 
... {"pqr":"music"}, {"pqr":"movies"},{"pqr":"sports"}, {"pqr":"news"}, 
... {"pqr":"sports"}] 
>>> from collections import Counter 
>>> counts = Counter(key for dic in d for key in dic.keys()) 
>>> counts 
Counter({'pqr': 5, 'abc': 3, 'xyz': 1}) 
>>> for key in counts: 
...  print (key, counts[key]) 
... 
xyz 1 
abc 3 
pqr 5 
3

당신은 무엇을 설명하고 - 각 키에 대해 여러 값 목록을 - 더 나은 이런 식으로 가시화 될 것이다 :

{'abc': ['movies', 'sports', 'music'], 
'xyz': ['music'], 
'pqr': ['music', 'movies', 'sports', 'news'] 
} 

을이 경우에는 삽입 좀 더 많은 작업을 수행 할 수 있습니다

이미
  • 을 존재하는 경우
    1. 조회 키는
  • 은 가치있는 검색, 존재 가치 [] (빈 목록)에 새 키를 생성하지 않으면 볼 수 새 값이 아닌 경우 전자 (키와 연관된 목록) 값이 확인되는 경우
  • 사용 if value in가 볼 수는 목록
  • 이것은 또한 리드 .append()
  • 존재 저장된 요소의 총 수를 계산하는 쉬운 방법 :

    # Pseudo-code 
    for myKey in myDict.keys(): 
        print "{0}: {1}".format(myKey, len(myDict[myKey]) 
    
    1

    컬렉션을 사용하십시오. 한 항목 사전 목록이 있다고 가정하면 ...

    from collections import Counter 
    listOfDictionaries = [{'abc':'movies'}, {'abc':'sports'}, {'abc':'music'}, 
        {'xyz':'music'}, {'pqr':'music'}, {'pqr':'movies'}, 
        {'pqr':'sports'}, {'pqr':'news'}, {'pqr':'sports'}] 
    Counter(list(dict)[0] for dict in zzz) 
    
    4

    카운터를 사용할 필요가 없습니다.이 방법으로 얻을 수 있습니다 @akashdeep 솔루션에

    # input dictionary 
    d=[{"abc":"movies"}, {"abc": "sports"}, {"abc": "music"}, {"xyz": "music"}, {"pqr":"music"}, {"pqr":"movies"},{"pqr":"sports"}, {"pqr":"news"}, {"pqr":"sports"}] 
    
    # fetch keys 
    b=[j[0] for i in d for j in i.items()] 
    
    # print output 
    for k in list(set(b)): 
        print "{0}: {1}".format(k, b.count(k)) 
    
    +0

    이것은 카운터를 사용하는 것보다 훨씬 빠릅니다. – akashdeep

    +0

    예, 카운터에 성능 문제가 있습니다. http://stackoverflow.com/questions/27801945/surprising-results-with-python-timeit-counter-vs-defaultdict-vs-dict – sashab

    1

    건물 질문에서 언급 한 "별개"요구 사항에 대한 계산되지 않기 때문에 세트를 사용하지만 잘못된 결과를 제공 (pqr 5, 4하지해야).

    # dictionary 
    d=[{"abc":"movies"}, {"abc": "sports"}, {"abc": "music"}, {"xyz": "music"}, {"pqr":"music"}, {"pqr":"movies"},{"pqr":"sports"}, {"pqr":"news"}, {"pqr":"sports"}] 
    
    # merged dictionary 
    c = {} 
    for i in d: 
        for k,v in i.items(): 
         try: 
          c[k].append(v) 
         except KeyError: 
          c[k] = [v] 
    
    # counting and printing 
    for k,v in c.items(): 
        print "{0}: {1}".format(k, len(set(v))) 
    

    이 올바른을 줄 것이다 : 당신은 당신이 사전의 목록을 의미

    xyz: 1 
    abc: 3 
    pqr: 4