36

繰り返しアイテムのリストがあり、頻度のあるユニークなアイテムのリストが必要です。

たとえば、私は持っています['a', 'a', 'b', 'b', 'b']、そして私は欲しいです[('a', 2), ('b', 3)]

2回ループせずにこれを行う簡単な方法を探しています。

4

10 に答える 10

68

Python 2.7以降では、を使用できますcollections.Counter

それ以外の場合は、このカウンターレシピを参照してください。

Python 2.7以降:

from collections import Counter
input =  ['a', 'a', 'b', 'b', 'b']
c = Counter( input )

print( c.items() )

出力は次のとおりです。

[('a'、2)、('b'、3)]

于 2010-03-06T15:20:11.743 に答える
15

アイテムがグループ化されている場合(つまり、類似したアイテムがまとめられている場合)、最も効率的な方法はitertools.groupby次のとおりです。

>>> [(g[0], len(list(g[1]))) for g in itertools.groupby(['a', 'a', 'b', 'b', 'b'])]
[('a', 2), ('b', 3)]
于 2010-03-06T15:18:04.837 に答える
13
>>> mylist=['a', 'a', 'b', 'b', 'b']
>>> [ (i,mylist.count(i)) for i in set(mylist) ]
[('a', 2), ('b', 3)]
于 2010-03-06T16:50:05.073 に答える
5

サードパーティのライブラリを使用する場合は、NumPyが便利なソリューションを提供します。これは、リストに数値データのみが含まれている場合に特に効率的です。

import numpy as np

L = ['a', 'a', 'b', 'b', 'b']

res = list(zip(*np.unique(L, return_counts=True)))

# [('a', 2), ('b', 3)]

構文を理解するために、np.uniqueここで一意の値とカウントのタプルを返すことに注意してください。

uniq, counts = np.unique(L, return_counts=True)

print(uniq)    # ['a' 'b']
print(counts)  # [2 3]

参照:通常のPythonリストに対するNumPyの利点は何ですか?

于 2018-09-07T15:31:22.007 に答える
3

私はこれがワンライナーではないことを知っています...しかし、私はそれが好きです。なぜなら、最初の値のリストを(countを呼び出す代わりに)一度渡すことが明らかだからです:

>>> from collections import defaultdict
>>> l = ['a', 'a', 'b', 'b', 'b']
>>> d = defaultdict(int)
>>> for i in l:
...  d[i] += 1
... 
>>> d
defaultdict(<type 'int'>, {'a': 2, 'b': 3})
>>> list(d.iteritems())
[('a', 2), ('b', 3)]
>>>
于 2010-03-06T15:31:06.650 に答える
3

「昔ながらのやり方」。

>>> alist=['a', 'a', 'b', 'b', 'b']
>>> d={}
>>> for i in alist:
...    if not d.has_key(i): d[i]=1  #also: if not i in d
...    else: d[i]+=1
...
>>> d
{'a': 2, 'b': 3}
于 2010-03-06T16:34:06.657 に答える
1

これを行う別の方法は

mylist = [1, 1, 2, 3, 3, 3, 4, 4, 4, 4]
mydict = {}
for i in mylist:
    if i in mydict: mydict[i] += 1
    else: mydict[i] = 1

次に、タプルのリストを取得するには、

mytups = [(i, mydict[i]) for i in mydict]

これはリストを1回だけ調べますが、辞書を1回トラバースする必要もあります。ただし、リストに重複が多数あることを考えると、辞書ははるかに小さくなり、トラバースが速くなります。

それにもかかわらず、非常にきれいで簡潔なコードではないことを認めます。

于 2010-03-06T15:48:21.873 に答える
1

ハッシュなしのソリューション:

def lcount(lst):
   return reduce(lambda a, b: a[0:-1] + [(a[-1][0], a[-1][1]+1)] if a and b == a[-1][0] else a + [(b, 1)], lst, [])

>>> lcount([])
[]
>>> lcount(['a'])
[('a', 1)]
>>> lcount(['a', 'a', 'a', 'b', 'b'])
[('a', 3), ('b', 2)]
于 2010-03-06T17:28:09.920 に答える
1

任意のデータ構造をパンダシリーズに変換します。

コード:

for i in sort(s.value_counts().unique()):
  print i, (s.value_counts()==i).sum()
于 2015-04-29T20:59:43.137 に答える
0

パンダの助けを借りて、あなたは次のようにすることができます:

import pandas as pd
dict(pd.value_counts(my_list))
于 2018-05-15T10:05:48.430 に答える