2016-10-05 4 views
-1

ペアののリストの長いリストの最大に対処しながら、私は私が最初の最大値を取得しようとしています、このようなMAX()

[ 
    [(0, 1), (1, 1), (2, 1), (3, 4), (4, 1), (5, 1), (6, 1),...,(141,3)], 
    ..., 
    [(12, 1), (36, 1), (91, 1), (92, 1), (110, 1),..., (180, 1)] 
] 

として、非常に奇妙な問題が発生しましたすべてのペアの要素。 Pythonically、私がやっていた:リスト281本のリストより短い場合、実際に、正しい番号を返し

max([max(x) for x in list])[0] 

を。 実際には、できるだけ早くリストは長い280以上であると、私は、長いリスト

max([max(x) for x in list[0:280]])[0] 

結構ですため、

ValueError: max() arg is an empty sequence 

だから、このメッセージが表示されます

max([max(x) for x in list[0:281]])[0] 

休憩中。

ここで何か問題がありますか?

+0

[MCVE]を提供できますか? –

+2

スライス付きサンプルは無効ですPython。実際に問題を再現する[mcve]を提供してください。 –

+0

実際には、プロセス中に何とかしぼんだ空のリストでした。 作成プロセスが複雑で、数行に簡単には煮詰められないため、すぐには提供しませんでした。とにかく、問題は実際には些細なものだったので、私はすべての質問を削除するかもしれません – Francesco

答えて

5

リストのリストのうち、インデックス280に空のリストがあります。[:280]にスライスすると除外され、[:281]に含まれます。

これは、簡単に短いサンプルで再現されています

>>> lsts = [ 
...  [(0, 1), (1, 1)], 
...  [(2, 1), (3, 4)], 
...  [(4, 1), (5, 1)], 
...  [], # empty at index 3 
... ] 
>>> max(max(x) for x in lsts) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <genexpr> 
ValueError: max() arg is an empty sequence 
>>> max(max(x) for x in lsts[:3]) # include everything before index 3 
(5, 1) 

あなたはchain.from_iterable()を使用して、ここで、一緒にあなたのリストをチェーンによって完全に問題を回避することができます

from itertools import chain 

max(chain.from_iterable(list_of_lists))[0] 

これは、一つとしてすべてのネストされたリストを扱いますそれらの間の空のリストは単に新しいシーケンスに寄与しません。

+0

ありがとう、これは実際に問題でした。どういうわけか、作成プロセス中に空のリストが忍び込んだ。 – Francesco

0

なぜこれだけではないのですか?

max([max([t[0] for t in sl if t]) for sl in l if sl]) 

先頭から1番目の項目を抽出できます。空のリストとタプルは無視されます。

max([max([t for t in sl if t]) for sl in l if sl])[0] 

EDITは、より効率的です。

+0

サブスクリプション* once *を使う方が速いです。 'tuple .__ gt__'メソッドは、Pythonバイトコードが各要素に対してサブスクリプションを実行できるよりもはるかに高速にCコードの内容をテストできます。 –

+0

@Martijn Pieters:良い点、そうだ –