3

理解します

a = max(set(lst), key=lst.count)

リスト内の最も一般的な要素を導出します

しかし、ヘルパー関数を使用せずにリストのリストで最も一般的な要素をどのように導出しますか?

例えば

lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']]

出力は等しいはず1です。

やってみるとa = max(set(lst), key=lst.count)

それは書くbuiltins.TypeError: unhashable type: 'list'

誰でも私を助けてもらえますか?

4

4 に答える 4

4

多くの方法がありますが、標準モジュールにはそのようなことを行うための優れたツールがいくつかあることをお知らせしたいと思いますcollections.Counter

In [1]: lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']]
In [2]: from collections import Counter
In [3]: from operator import itemgetter
In [4]: max((Counter(l).most_common(1)[0] for l in lst), key=itemgetter(1))[0]
Out[4]: '1'

または、サブリストごとに現在のソリューションを(ちょっと)採用することもできます。

In [5]: max(((max(set(l), key=l.count), l) for l in lst),
   ...: key=lambda x: x[1].count(x[0]))[0]
Out[5]: '1'
于 2012-11-24T21:49:00.927 に答える
3

を平らにして、その上でlist of list使用collections.Counterしてください。次に、Counter.most_common()メソッドを使用して、出現回数が最大のものから最小のものまでの要素listを取得します。tuple

>>> lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']]
>>> flattened_list = [elem for sublist in lst for elem in sublist]  
>>> flattened_list
['1', '2', '3', '4', '1', '1', '1', '1', '1', '2', '3', '4']
>>>
>>> from collections import Counter
>>>
>>> counter = Counter(flattened_list)
>>> counter.most_common()
[('1', 6), ('3', 2), ('2', 2), ('4', 2)]
>>>
>>> counter.most_common(1)
('1', 6)

または、メソッドを使用して、リストから最も一般的な要素を取得できますflatten

>>> max(set(flattened_list), key=flattened_list.count)
'1'

次のようにリストを平坦化することもできます: -

>>> sum(lst, [])
['1', '2', '3', '4', '1', '1', '1', '1', '1', '2', '3', '4']

したがって、ワンライナーとして、次のようにすることができます: -

>>> lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']]

>>> max(set(sum(lst, [])), key=sum(lst, []).count)
'1'

もちろん、最後のリストは同じ内容の 2 つのリストを作成します。

于 2012-11-24T21:50:52.397 に答える
1

リストを( でchain(*lst))フラット化し、リストの各要素のエントリを でカウントしてCounter(chain(*lst).most_common())、結果をソートする必要があります。

from itertools import chain
from collections import Counter

lst = [['1','2','3','4'],['1','1','1','1'],['1','2','3','4']]
sorted(Counter(chain(*lst)).most_common())[0][0]
于 2012-11-24T22:02:52.403 に答える
0

Counter最も一般的な要素を見つけ、chainリストのリストの要素を反復処理するために使用できます。

from collections import Counter
from itertools import chain

print Counter(val for val in chain.from_iterable(lst)).most_common(1)
于 2015-04-05T01:17:42.430 に答える