LoginSignup
7
6

More than 5 years have passed since last update.

配列やtupleでユニークな値のカウントをとりたい

Last updated at Posted at 2015-11-12

やりたいこと

['a', 'a', 'b', 'b', 'b'] を、[('a', 2), ('b', 3)] にしたい。そこから2個以上だけ取りたい。
SQLなら簡単そう。Pythonだけで出来ないものか。

やり方

以下で出来た

[(g[0], len(list(g[1]))) for g in itertools.groupby(array.sort())]

Example

>>> import itertools
>>> array = ['a', 'a', 'b', 'b', 'b']
>>> uniq = [(g[0], len(list(g[1]))) for g in itertools.groupby(array.sort())]
>>> uniq
[('a', 2), ('b', 3)]

やりたかったこと

>>> tuples = [('aaa', 'bbb'), ('aaa', 'bbb'), ('aaa', 'vvv'), ('bbb', 'ccc'), ('bbb', 'ccc')]
>>> uniq = [(g[0], len(list(g[1]))) for g in itertools.groupby(tuples.sort())]
>>> uniq
[(('aaa', 'bbb'), 2), (('aaa', 'vvv'), 1), (('bbb', 'ccc'), 2)]
>>>  filter(lambda f: f[1] > 1, uniq)
[(('aaa', 'bbb'), 2), (('bbb', 'ccc'), 2)]

2個以上のものだけ抜き取れた。

参考


さらに便利なライブラリについてコメントを頂いたので。

もっと便利なcollectionsがあった

>>> from collections import Counter
>>> tuples = [('aaa', 'bbb'), ('aaa', 'bbb'), ('aaa', 'vvv'), ('bbb', 'ccc'), ('bbb', 'ccc')]
>>> uniq = Counter(tuples)
>>> uniq 
Counter({('aaa', 'bbb'): 2, ('bbb', 'ccc'): 2, ('aaa', 'vvv'): 1})
>>> filter(lambda f: f[1] > 1, uniq.items())
[(('aaa', 'bbb'), 2), (('bbb', 'ccc'), 2)]

collections.Counter 使いましょう!!

参考

7
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6