2017-12-27 14 views
-1

のリストに特定のインデックスで最も一般的な値であるかどうか確認するために、私は整数のリストのリストを持っている:どのようにリスト

ls = [[1,2,3],[2,2,3],[1,1,3]] 

を、私はlen(ls[0])の要素を持つリストで終わるしたいです、各要素はその索引で最も多く現れる要素です。この例では、結果は[1 (appears in first&last), 2 (appears in first&second), 3 (appears in all)]

だろう、私はループを使用してみましたし、内蔵のallようにするために期待していた(ほとんど?)

ls = [[1,2,3],[2,2,3],[1,1,3]] 

ls2=[] 

ls2 =[item for sub in ls for item in sub] 

ls2 
Out[40]: [1, 2, 3, 2, 2, 3, 1, 1, 3] 

ls3=[] 

for item in len(ls):... 

そうする方法でしょうか?

+0

はあなたが表示さ(と、それが失敗した方法を記述)することができます任意の試みを作ったことがありますか? – glibdud

+0

何を試しましたか?尋ねられたように、これは基本的に「自分のコードを書いてください」という質問です。あなたが出発点を必要とするなら 'Counter 'と' most_common'メソッドを含む適切な解決法があります。 'operator.itemgetter'と' map'を使って最適化することができます(プレーンジェネレータの式はうまくいくはずです)。 – ShadowRanger

答えて

1

私の(代替ソリューション)の2セント:ここ

>>> ls = [[1, 2, 3], [2, 2, 3], [1, 1, 3]] 
>>> l_mc = [max(x, key=x.count) for x in zip(*ls)] 
>>> l_mc 
[1, 2, 3] 
+2

'max(x、key = x.count)'は、各 'count'呼び出しのために不必要に' x'を再スキャンするため、 'x'の長さで実行時二次関数をとります。 「カウンタ」ベースの解法は、通常のケースの線形時間を要する。 – user2357112

+1

私は「知っておいて」と言った。モデレーターは、人のコメントを無作為に削除することを控えてください。 – mentalita

3

リストを転記し、カウンタを適用します。

>>> from collections import Counter 
>>> ls = [[1,2,3],[2,2,3],[1,1,3]] 
>>> counts = [Counter(x) for x in zip(*ls)] 
>>> [c.most_common(1)[0][0] for c in counts] 
[1, 2, 3] 

同じインデックスで2つの数字が最高の出現を共有する場合は、任意の数字が選択されます。

+0

任意の数字 - そのインデックスの最高出現数を持つ数字からですか?それらの番号のリストを取得することは可能ですか? – CIsForCookies

+0

@CIsForCookies yesともに – timgeb

0

は別の方法です:

from collections import Counter 
from operator import itemgetter 

ls = [[1, 2, 3], [2, 2, 3], [1, 1, 3]] 

print([max(x.items(), key = itemgetter(1))[0] for x in map(Counter, zip(*ls))]) 
# [1, 2, 3] 
関連する問題