7

以下のタプルのリストから対応する最大の整数を持つ最初の 6 つの名前 (名前のみ) を返したいと思います。最高 (sms) から最低 (boss) まですべての名前を返すことができました。

[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)]

ありがとうございました。

4

3 に答える 3

11

heapq.nlargestあなたがここで欲しいものです:

import heapq
from operator import itemgetter
largest_names = [x[0] for x in heapq.nlargest(6,your_list,key=itemgetter(1))]

最大の要素のみを取得して残りを破棄するため、並べ替えよりも効率的です。もちろん、リストが他の理由で事前にソートされている場合は、スライスよりも効率的ではありません。

複雑:

  • ヒープ: O(N)
  • 並べ替え: O(NlogN)
  • スライス (事前にソートされている場合のみ): O(6)

説明:

heapq.nlargest(6,your_list,key=itemgetter(1)) 

この行は (name,value) タプルのリストを返しますが、最大の 6 つだけです -- 比較はタプルの 2 番目の (index=1 --> key=itemgetter(1)) 要素によって行われます。

行の残りの部分は、タプルの名前部分のみを取得してリストに格納する 6 つの最大の名前と値のタプルに対するリスト内包表記です。


collections.Counterこのデータも同様に保存できることに興味があるかもしれません。

d = collections.Counter(dict(your_list))
biggest = [x[0] for x in d.most_common(6)]

おそらく、この計算を行うためだけに変換する価値はありません (結局のところ、これが heapq の目的です ;-) が、データを扱いやすくするために変換する価値があるかもしれません。

于 2012-10-09T13:45:25.473 に答える
4
data=[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)]
return [x[0] for x in sorted(data, key=lambda x: x[1], reverse=True)[0:6]]

これは次のことを行います:

  • sorted関数を使用してソートされたデータを返しますkey。標準の並べ替え順序は昇順であるため、reverse=True降順を設定します。
  • lambda x: x[1]引数の 2 番目の要素 (この場合はタプル) を返す無名関数です。itemgetter(1)これを行うにはより良い方法ですが、追加のインポートが必要です。
  • [0:6]リストの最初の 6 要素をスライスします。
  • [x[0] for x in ... ]渡された各タプルの最初の要素のリストを作成します。
于 2012-10-09T13:44:53.343 に答える
1

データが既にソートされている場合は、単純に最初の 6 つのタプルを切り取り、名前を取得します。

first_six = data[0:6]  # or data[:6]
only_names = [entry[0] for entry in first_six]

リスト内包表記は、次のように展開できます。

only_names = []
for entry in first_six:
    only_names.append(entry[0])

リストがまだソートされていない場合はメソッド (または組み込み) のkeyキーワード引数を使用して、スコアでソートできます。sortsorted

data.sort(key=lambda entry: entry[1], reverse=True)

lambdaは無名関数です。同等のものは次のとおりです。

def get_score(entry):
    return entry[1]

data.sort(key=get_score, reverse=True)
于 2012-10-09T13:43:48.913 に答える