2016-12-23 8 views
0

私は(sqlite3の持つselect文から生成された)このようなタプルのリストがあります:タプルのリストから上位5最大を取得する - Pythonの

itemsAndQtyBought = [('Item no.1', 3), ('Item no.2', 0), ('Item no.3', 3), ('Item no.4', 2), ('Item no.5', 1), ('Item no.6', 9), ('Item no.7', 7)] 

をし、リストがオンに運びます。それはタプルのリストであり、その商品の商品名と購入数量があります。

購入数量が最も多い5つのアイテムで、そのタプルのリストからトップ5アイテムのタプルのリストを作成する必要があります。

、それはこのように判明するでしょう上のリストとたとえば:

newItemsQtyBought = [('Item no.6', 9), ('Item no.7', 7), ('Item no.3', 3), ('Item no.1', 3), ('Item no.4', 2)] 

これを実行する方法はありますか?

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

+1

役立つことを願っていますか? – ekhumoro

+0

商品が複数回掲載される可能性はありますか?言い換えれば、 ''( 'りんご'、3)、( 'りんご'、2)] 'は'( 'りんご'、5)に足りるはずですか?その場合、['collections.Counter'](https://docs.python.org/3/library/collections.html#collections.Counter)は、あなたが望むものを正確に行います。また、これまでに何を試しましたか? –

答えて

6

だけでソートを使用し、最初の5つの項目をスライス:

In [170]: sorted(itemsAndQtyBought, key=lambda t: t[1], reverse=True)[:5] 
Out[170]: 
[('Item no.6', 9), 
('Item no.7', 7), 
('Item no.1', 3), 
('Item no.3', 3), 
('Item no.4', 2)] 
3

あなたはheapq.nlargest()を使用することができます。

from heapq import nlargest 
from operator import itemgetter 

nlargest(5, my_list, key=itemgetter(1)) 

(nは、反復可能な[キー])heapq.nlargest

で定義されたデータセットの最大要素をnのリストで返します。繰り返し可能です。 キー、提供される場合、 が反復可能の各要素から比較キーを抽出するために使用されていることを一つの引数の機能を指定: と同等key=str.lowersorted(iterable, key=key, reverse=True)[:n]

出力:

>>> my_list = [('Item no.1', 3), ('Item no.2', 0), 
...   ('Item no.3', 3), ('Item no.4', 2), 
...   ('Item no.5', 1), ('Item no.6', 9), 
...   ('Item no.7', 7)] 
>>> 
>>> nlargest(5, my_list, key=itemgetter(1)) 
[('Item no.6', 9), ('Item no.7', 7), ('Item no.1', 3), ('Item no.3', 3), ('Item no.4', 2)] 
+1

あなたは私にそれを打ちました。私の答えは削除しましたが、私はキーのラムダの代わりに 'operator.itemgetter'を使用します! –

+0

@ juanpa.arrivillaga 'lambda'の代わりに' operator.itemgetter() 'を使うように編集しました;) – ettanany

1
sorted(itemsAndQtyBought, key=lambda item: item[1], reverse=True)[:5] 

出力:

[('Item no.6', 9), ('Item no.7', 7), ('Item no.1', 3), ('Item no.3', 3), ('Item no.4', 2)] 

唯一の欠点は:それは全体のリストをソート

0

は、それはあなたあなたがちょうどあなたが実際にしたい項目のリストを作成するselect文自体を使用していないのはなぜ

from operator import itemgetter 

def newItem(oldItem): 
     newItemQtyBought = sorted(oldItem,key=itemgetter(1)) 
     return newItemQtyBought[-5:] 

def main(): 
     itemsAndQtyBought = [('Item no.1', 3), ('Item no.2', 0), ('Item no.3', 3), ('Item no.4', 2), ('Item no.5', 1), ('Item no.6', 9), ('Item no.7', 7)] 
     print(newItem(itemsAndQtyBought)) 

if __name__=="__main__": 
     main() 
関連する問題