バイモーダルリストなどを操作できるようにします。
これまでの私の試み:
testlist = [1,2,3,3,2,1,4,2,2,3,4,3,3,4,5,3,2,4,55,6,7,4,3,45,543,4,53,4,53,234]
。
from collections import Counter
def modal_1(xs):
cntr = Counter(xs).most_common()
val,count = cntr[0]
return (v for v,c in cntr if c is count)
print(list(modal_1(testlist)))
>>> [3, 4]
-またはおそらく-のようなもの
def modal_2(xs):
cntr = Counter(xs).most_common()
val,count = cntr[0]
return takewhile(lambda x: x[1] is count, cntr)
print(list(modal_2(testlist)))
>>> [(3, 7), (4, 7)]
答えないでください-numpyなどを使用してください。
ノート :
Counter(xs).most_common(1)
n個のモーダル値の最初の「モーダル」を返します。2つある場合。最初のものだけを返します。これは残念です...それはこれを非常に簡単にするからです。
わかりました、それで私は実際に私の元のオプションの1つが実際にこれを行うための良い方法であることに非常に驚いていました。リストからn個のモーダル番号を検索したい場合は、次のオプションをお勧めします。これらの関数は両方とも、1000を超える値を持つリストでうまく機能します
(number、count)のこれらすべての戻りリスト。ここで、countはすべてのタプルで同一になります。これを持って、あなたの心の望みにそれを解析する方が良いと思います。
takewhileの使用:
from collections import Counter
from itertools import takewhile
def modal_3(xs):
counter = Counter(xs).most_common()
mx = counter[0][1]
return takewhile(lambda x: x[1] == mx, counter)
print(list(modal_3(testlist)))
>>> [(3, 7), (4, 7)]
groupbyの使用:
from collections import Counter
from itertools import groupby
from operator import itemgetter
def modal_4(xs):
container = Counter(xs)
return next(groupby(container.most_common(), key=itemgetter(1)))[1]
print(list(modal_4(testlist)))
>>> [(3, 7), (4, 7)]
そして最後の、pythonic、そして最速の方法:
def modal_5(xs):
def _mode(xs):
for x in xs:
if x[1] != xs[0][1]:
break
yield x
counter = collections.Counter(xs).most_common()
return [ x for x in _mode(counter) ]
助けと情報をありがとうございました。