programing

Python의 항목 빈도 수

goodcopy 2021. 1. 16. 10:33
반응형

Python의 항목 빈도 수


단어 목록이 있고 해당 목록에 각 단어가 나타나는 횟수를 찾고 싶다고 가정합니다.

이를 수행하는 확실한 방법은 다음과 같습니다.

words = "apple banana apple strawberry banana lemon"
uniques = set(words.split())
freqs = [(item, words.split().count(item)) for item in uniques]
print(freqs)

그러나 프로그램이 단어 목록을 두 번, 세트를 구성하기 위해 한 번, 출현 횟수를 계산하기 위해 두 번 실행하기 때문에이 코드가 그리 좋지 않다는 것을 알았습니다.

물론 목록을 실행하고 계산을 수행하는 함수를 작성할 수 있지만 그렇게 Pythonic은 아닙니다. 그렇다면 더 효율적이고 파이썬적인 방법이 있습니까?


구조에 defaultdict !

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"

d = defaultdict(int)
for word in words.split():
    d[word] += 1

이것은 O (n)에서 실행됩니다.


모듈 Counter클래스collections이러한 유형의 문제를 해결하기 위해 만들어졌습니다.

from collections import Counter
words = "apple banana apple strawberry banana lemon"
Counter(words.split())
# Counter({'apple': 2, 'banana': 2, 'strawberry': 1, 'lemon': 1})

표준 접근 방식 :

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"
words = words.split()
result = defaultdict(int)
for word in words:
    result[word] += 1

print result

Groupby oneliner :

from itertools import groupby

words = "apple banana apple strawberry banana lemon"
words = words.split()

result = dict((key, len(list(group))) for key, group in groupby(sorted(words)))
print result

freqs = {}
for word in words:
    freqs[word] = freqs.get(word, 0) + 1 # fetch and increment OR initialize

이 결과는 Triptych의 솔루션과 동일하지만 컬렉션을 가져 오지는 않습니다. 또한 Selinap의 솔루션과 비슷하지만 더 읽기 쉽습니다. Thomas Weigel의 솔루션과 거의 동일하지만 예외를 사용하지 않습니다.

그러나 컬렉션 라이브러리의 defaultdict ()를 사용하는 것보다 느릴 수 있습니다. 값을 가져 와서 증분 한 다음 다시 할당합니다. 그냥 증가하는 대신. 그러나 + =를 사용하면 내부적으로 똑같이 할 수 있습니다.


표준 사전 방법 (적절한 사전 키를 증가시키는 목록을 반복)을 사용하지 않으려면 다음을 시도 할 수 있습니다.

>>> from itertools import groupby
>>> myList = words.split() # ['apple', 'banana', 'apple', 'strawberry', 'banana', 'lemon']
>>> [(k, len(list(g))) for k, g in groupby(sorted(myList))]
[('apple', 2), ('banana', 2), ('lemon', 1), ('strawberry', 1)]

O (n log n) 시간에 실행됩니다.


defaultdict없이 :

words = "apple banana apple strawberry banana lemon"
my_count = {}
for word in words.split():
    try: my_count[word] += 1
    except KeyError: my_count[word] = 1

그냥 카운트를 사용할 수 없습니까?

words = 'the quick brown fox jumps over the lazy gray dog'
words.count('z')
#output: 1

나는 Spark 운동을했고, 여기 내 해결책이 있습니다.

tokens = ['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog']

print {n: float(tokens.count(n))/float(len(tokens)) for n in tokens}

** # 위의 출력 **

{'brown': 0.16666666666666666, 'lazy': 0.16666666666666666, 'jumps': 0.16666666666666666, 'fox': 0.16666666666666666, 'dog': 0.16666666666666666, 'quick': 0.16666666666666666}

목록을 단일 dict로 변환하려면 reduce ()를 사용하십시오.

words = "apple banana apple strawberry banana lemon"
reduce( lambda d, c: d.update([(c, d.get(c,0)+1)]) or d, words.split(), {})

보고

{'strawberry': 1, 'lemon': 1, 'apple': 2, 'banana': 2}

words = "apple banana apple strawberry banana lemon"
w=words.split()
e=list(set(w))       
for i in e:
   print(w.count(i))    #Prints frequency of every word in the list

도움이 되었기를 바랍니다!


The answer below takes some extra cycles, but it is another method

def func(tup):
    return tup[-1]


def print_words(filename):
    f = open("small.txt",'r')
    whole_content = (f.read()).lower()
    print whole_content
    list_content = whole_content.split()
    dict = {}
    for one_word in list_content:
        dict[one_word] = 0
    for one_word in list_content:
        dict[one_word] += 1
    print dict.items()
    print sorted(dict.items(),key=func)

ReferenceURL : https://stackoverflow.com/questions/893417/item-frequency-count-in-python

반응형