2017-04-01 10 views
0

現在、これは候補のリストを取り、スコアが最も低い候補が最初のポジションになるようにソートします。それは各リストをチェックするようにします。そして、2番目のフィールドの番号が最初のものと等しくなければ、このリストを削除しますか? I [x]は候補者で最も低いか等しい最小の数ではありませんすべてのリストを削除しようとしています[1]:リストのリストをソートしてリストを削除する方法

candidates = [[name, 3, characteristic], [name, 7, characteristic], [name, 3, characteristic]] 

ので、次のコードは、唯一の候補を削除する必要があります[1]

from operator import itemgetter 

candidates.sort(key=itemgetter(1)) 

for [x][1] in candidates: 
    if candidates[x][1] != candidates[0][1] : 
     candidates.remove(candidates[x]) 

ありがとう!

+0

私はあなたを正しく理解していれば、これを行うために 'filter()'関数を使うことができます – MoQ93

+0

そうですね、どのリストをリストとして実装するのかわかりませんでしたか? –

答えて

0

解決策の問題は、同じリストを反復しながらcandidatesリストを変更することです。これはおそらく気づいたように問題を引き起こします。

sorted()ではなく、min()とキーを使用して、値が最も小さいアイテムを特定できます。これは、O(n)対O(n log n)のより良いパフォーマンスをもたらします。長いリストの候補がある場合は重要です。

また、最小値を先に決定し、変数に格納し、項目を比較するときにそれをリスト内包/フィルタで使用する方がよいでしょう。私はここにリストの内包表記を使用

from operator import itemgetter 

candidates = [['name', 97, 'blah'], ['name', 7, 'candidate'], ['name', 3, 'characteristic'], ['name', 3, 'characteristic']] 

min_value = min(candidates, key=itemgetter(1))[1] 
candidates = [candidate for candidate in candidates if candidate[1] == min_value] 
print(candidates) 
# [['name', 3, 'characteristic'], ['name', 3, 'characteristic']] 

注:これは、より効率的なソリューションが得られmin()に複数の冗長呼び出しを避けることができます。それらはもっとPythonicと見なされ、より良いパフォーマンスを持つことができ、多くの状況でより良いパフォーマンスをもたらすジェネレータ表現に簡単に変更できます。

0

私はあなたの意味を誤解していない場合は、これを試すことができます。

from operator import itemgetter 
candidates = [['name', 3, 'characteristic'], ['name', 7, 'characteristic'], ['name', 3, 'characteristic']] 

candidates=filter(lambda x:x[1]==sorted(candidates,key=itemgetter(1))[0][1],candidates) 

print(candidates) 

は、2番目のフィールドは、最低のスコアに等しくない場合、サブリストを削除するためにfilter()メソッドを使用します。

あなたがPython3.xを使用している場合、あなたはlist(filter(...))

出力を使用する必要があります

[['name', 3, 'characteristic'], ['name', 3, 'characteristic']] 

を更新

私はあなたが得るためにmin()を使用できることを忘れてしまいました最低スコア、それはより効率的な方法です:

candidates = [['name', 3, 'characteristic'], ['name', 7, 'characteristic'], ['name', 3, 'characteristic']] 

candidates=list(filter(lambda x:x[1]==min([i[1] for i in candidates]),candidates)) 

print(candidates) 
+0

これは、を返すようになりましたか? –

+0

@TimJames Python3.xでは、結果をlistに変換するために 'list(filter(...))'を使うべきです。 – McGrady

+0

これは効率的ではありません。リストはリスト内の各項目に対して1回ソートされます。一度ソートして結果を保存し、 'min()'を使うのが良いでしょう。 – mhawke

関連する問題