順不同リストの要素の頻度を見つける必要があります
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
出力->
b = [4,4,2,1,2]
また、私はから重複を削除したいです
a = [1,2,3,4,5]
順不同リストの要素の頻度を見つける必要があります
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
出力->
b = [4,4,2,1,2]
また、私はから重複を削除したいです
a = [1,2,3,4,5]
回答:
注:を使用する前にリストをソートする必要がありますgroupby
。
リストが順序付きリストの場合はgroupby
、itertools
パッケージから使用できます。
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
from itertools import groupby
[len(list(group)) for key, group in groupby(a)]
出力:
[4, 4, 2, 1, 2]
groupby
。しかし、効率とdictアプローチの
sum(1 for _ in group)
。
[(key, len(list(group))) for key, group in groupby(a)]
または{key: len(list(group)) for key, group in groupby(a)}
@buhtz
Python 2.7(またはそれ以降)では、以下を使用できますcollections.Counter
。
import collections
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
counter=collections.Counter(a)
print(counter)
# Counter({1: 4, 2: 4, 3: 2, 5: 2, 4: 1})
print(counter.values())
# [4, 4, 2, 1, 2]
print(counter.keys())
# [1, 2, 3, 4, 5]
print(counter.most_common(3))
# [(1, 4), (2, 4), (3, 2)]
Python 2.6以前を使用している場合は、こちらからダウンロードできます。
collections.Counter
サブクラスですdict
。通常の辞書と同じように使用できます。ただし、本当に辞書が必要な場合は、を使用して辞書に変換できますdict(counter)
。
Python 2.7以降では、辞書理解機能が導入されています。リストから辞書を作成すると、数が増えるだけでなく、重複を取り除くことができます。
>>> a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>> d = {x:a.count(x) for x in a}
>>> d
{1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
>>> a, b = d.keys(), d.values()
>>> a
[1, 2, 3, 4, 5]
>>> b
[4, 4, 2, 1, 2]
{x:a.count(x) for x in set(a)}
a.count()
は、の各要素に対して完全なトラバースを実行しa
、これをO(N ^ 2)quadradicアプローチにします。collections.Counter()
あるはるかに効率的な、それは線形時間(O(N))でカウントされるため。数字で、その手段は、このアプローチは対、長さ1000のリストについては、100万個の手順を実行しますちょうど1000ステップでCounter()
、唯一の10 ^ 6など、リスト内の百万項目、カウンタによって必要とされている10 ^ 12のステップ
a.count()
完全に使用することの恐怖は、そこでセットを使用した場合の効率よりも小さくなります。
出現回数を数えるには:
from collections import defaultdict
appearances = defaultdict(int)
for curr in a:
appearances[curr] += 1
重複を削除するには:
a = set(a)
Counter
は、だけでなく、float
またはを含む複数の数値型を使用できます。Decimal
int
Python 2.7以降では、collections.Counterを使用してアイテムをカウントできます
>>> a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>>
>>> from collections import Counter
>>> c=Counter(a)
>>>
>>> c.values()
[4, 4, 2, 1, 2]
>>>
>>> c.keys()
[1, 2, 3, 4, 5]
要素の頻度を数えるのはおそらく辞書で行うのが最も良いでしょう:
b = {}
for item in a:
b[item] = b.get(item, 0) + 1
重複を削除するには、セットを使用します。
a = list(set(a))
defaultdict
です。
b = {k:0 for k in a}
ですか?
あなたはこれを行うことができます:
import numpy as np
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
np.unique(a, return_counts=True)
出力:
(array([1, 2, 3, 4, 5]), array([4, 4, 2, 1, 2], dtype=int64))
最初の配列は値で、2番目の配列はこれらの値を持つ要素の数です。
だからあなたが数字で配列だけを取得したいなら、あなたはこれを使うべきです:
np.unique(a, return_counts=True)[1]
from collections import Counter
a=["E","D","C","G","B","A","B","F","D","D","C","A","G","A","C","B","F","C","B"]
counter=Counter(a)
kk=[list(counter.keys()),list(counter.values())]
pd.DataFrame(np.array(kk).T, columns=['Letter','Count'])
seta = set(a)
b = [a.count(el) for el in seta]
a = list(seta) #Only if you really want it.
count
途方もなく高価であり、このシナリオでは必要ありません。
私は単にscipy.stats.itemfreqを次のように使用します:
from scipy.stats import itemfreq
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
freq = itemfreq(a)
a = freq[:,0]
b = freq[:,1]
ここでドキュメントを確認できます:http : //docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.itemfreq.html
def frequencyDistribution(data):
return {i: data.count(i) for i in data}
print frequencyDistribution([1,2,3,4])
...
{1: 1, 2: 1, 3: 1, 4: 1} # originalNumber: count
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
# 1. Get counts and store in another list
output = []
for i in set(a):
output.append(a.count(i))
print(output)
# 2. Remove duplicates using set constructor
a = list(set(a))
print(a)
出力
D:\MLrec\venv\Scripts\python.exe D:/MLrec/listgroup.py
[4, 4, 2, 1, 2]
[1, 2, 3, 4, 5]
辞書を使用した簡単な解決策。
def frequency(l):
d = {}
for i in l:
if i in d.keys():
d[i] += 1
else:
d[i] = 1
for k, v in d.iteritems():
if v ==max (d.values()):
return k,d.keys()
print(frequency([10,10,10,10,20,20,20,20,40,40,50,50,30]))
max(d.values())
最後のループでは変更されません。ループでは計算せず、ループの前に計算します。
#!usr/bin/python
def frq(words):
freq = {}
for w in words:
if w in freq:
freq[w] = freq.get(w)+1
else:
freq[w] =1
return freq
fp = open("poem","r")
list = fp.read()
fp.close()
input = list.split()
print input
d = frq(input)
print "frequency of input\n: "
print d
fp1 = open("output.txt","w+")
for k,v in d.items():
fp1.write(str(k)+':'+str(v)+"\n")
fp1.close()
from collections import OrderedDict
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
def get_count(lists):
dictionary = OrderedDict()
for val in lists:
dictionary.setdefault(val,[]).append(1)
return [sum(val) for val in dictionary.values()]
print(get_count(a))
>>>[4, 4, 2, 1, 2]
重複を削除して順序を維持するには:
list(dict.fromkeys(get_count(a)))
>>>[4, 2, 1]
Counterを使用して周波数を生成しています。コードの1行のテキストファイルの単語からの辞書
def _fileIndex(fh):
''' create a dict using Counter of a
flat list of words (re.findall(re.compile(r"[a-zA-Z]+"), lines)) in (lines in file->for lines in fh)
'''
return Counter(
[wrd.lower() for wrdList in
[words for words in
[re.findall(re.compile(r'[a-zA-Z]+'), lines) for lines in fh]]
for wrd in wrdList])
これを行う別の方法ですが、より強力で強力なライブラリーNLTKを使用します。
import nltk
fdist = nltk.FreqDist(a)
fdist.values()
fdist.most_common()
Pythonで提供されている組み込み関数を使用できます。
l.count(l[i])
d=[]
for i in range(len(l)):
if l[i] not in d:
d.append(l[i])
print(l.count(l[i])
上記のコードは、リストの重複を自動的に削除し、元のリストと重複のないリストの各要素の頻度も出力します。
一発二羽!XD
記録のために、機能的な答え:
>>> L = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>> import functools
>>> >>> functools.reduce(lambda acc, e: [v+(i==e) for i, v in enumerate(acc,1)] if e<=len(acc) else acc+[0 for _ in range(e-len(acc)-1)]+[1], L, [])
[4, 4, 2, 1, 2]
あなたもゼロを数えるならそれはよりきれいです:
>>> functools.reduce(lambda acc, e: [v+(i==e) for i, v in enumerate(acc)] if e<len(acc) else acc+[0 for _ in range(e-len(acc))]+[1], L, [])
[0, 4, 4, 2, 1, 2]
説明:
acc
リストます。e
がL
のサイズよりも小さい場合、acc
この要素を更新するだけです。v+(i==e)
つまりv+1
、のインデックスi
がacc
現在の要素e
である場合は、それ以外の場合は前の値v
です。e
がL
のサイズ以上の場合、新しいをホストacc
するために拡張するacc
必要があります1
。要素をソートする必要はありません(itertools.groupby
)。負の数があると、奇妙な結果になります。
セットを使用して、これを行う別の方法を見つけました。
#ar is the list of elements
#convert ar to set to get unique elements
sock_set = set(ar)
#create dictionary of frequency of socks
sock_dict = {}
for sock in sock_set:
sock_dict[sock] = ar.count(sock)
リスト内の一意の要素を見つけるには
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
a = list(set(a))
辞書を使用してソートされた配列内の一意の要素の数を見つけるには
def CountFrequency(my_list):
# Creating an empty dictionary
freq = {}
for item in my_list:
if (item in freq):
freq[item] += 1
else:
freq[item] = 1
for key, value in freq.items():
print ("% d : % d"%(key, value))
# Driver function
if __name__ == "__main__":
my_list =[1, 1, 1, 5, 5, 3, 1, 3, 3, 1, 4, 4, 4, 2, 2, 2, 2]
CountFrequency(my_list)
リファレンス GeeksforGeeks
もう1つの方法は、辞書とlist.countを使用することです。
dicio = dict()
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
b = list()
c = list()
for i in a:
if i in dicio: continue
else:
dicio[i] = a.count(i)
b.append(a.count(i))
c.append(i)
print (b)
print (c)