2

バイモーダルリストなどを操作できるようにします。

これまでの私の試み:

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) ]

助けと情報をありがとうございました。

4

3 に答える 3

3

少し変更を加えて、2番目の例が最適だと思います。

from itertools import takewhile
from collections import Counter

def modal(xs):
       counter = Counter(xs).most_common()
       _, count = counter[0]
       return takewhile(lambda x: x[1] == count, counter)

ここでの変更は、 -アイデンティティのチェックで==はなく使用することです。これは、Pythonがバックグラウンドでsを使用してキャッシュするためにいくつかの魔法を実行するため、一部の値には当てはまりますが、常に当てはまるわけではなく、信頼すべきではありません。この場合。isisint

>>> a = 1
>>> a is 1
True
>>> a = 300
>>> a is 300
False
于 2012-06-21T21:34:33.740 に答える
2
>>> 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]
>>> dic={x:testlist.count(x) for x in set(testlist)}

>>> [x for x in dic if dic[x]==max(dic.values())]

[3, 4]
于 2012-06-21T21:36:36.857 に答える
2

何?takewhileしかし、ありませんgroupbyか?

>>> from collections import Counter
>>> 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]
>>> cntr = Counter(testlist)
>>> from itertools import groupby
>>> list(x[0] for x in next(groupby(cntr.most_common(), key=lambda x:x[1]))[1])
[3, 4]
于 2012-06-21T22:59:20.467 に答える