2012-03-07 12 views
1

私は辞書の関連リストであるitemsbookingsを持っています。私はどの品目が最も少ない予約をしているかを判断する必要があります。リスト内のオブジェクトの出現数を最も少なく見つける方法

実際の例では、データベース内にあるが、運動しのために、このデータを考慮してください。

from datetime import datetime 

item1 = {'foo1'} 
item2 = {'foo2'} 
items = [item1, item2] 

booking1 = {'Start':datetime(2012,1,1), 'Item':'foo1'} 
booking2 = {'Start':datetime(2012,1,2), 'Item':'foo1'} 
booking3 = {'Start':datetime(2012,1,1), 'Item':'foo2'} 
bookings = [booking1, booking2, booking3] 

どのように効率的に最も少ないの予約を持っている項目を決定することができますか?どんな助けでも大歓迎です!

あなたが collections.Counter(Pythonのマルチセット)で、ではないが、特に効率的に、簡単にこれを行うことができます
+2

が、それはSQLですデータベース?その場合は、select count distinctクエリでフィルタリングを実行するほうがはるかに高速になります。すべてをPythonにプルする必要がある場合は、リスト全体を反復処理する必要があるため、SQLからPythonに必要以上のデータを選択するという非効率性に加えて、O(n)になります。 – rob05c

+0

NoSQLですが、「別個の」同等のものがあります。私が照会すべき明確な価値についてもっと説明できますか?申し訳ありませんが、私はまだあなたに従っていません。 – MFB

+0

A)データベースに入っている場合は、データベースで作業をしてください...データベースは、設定に基づいた問題を非常によく扱っています.SQLに簡単に変換できるデータについて質問するかもしれない質問がたくさんあります。 B)それはあなたのデータのひどいデータ構造です。予約には複数のアイテムがありますか?クラスを予約しないのはなぜですか?これがデータベースデータの場合は、ORMを使用していませんか? – gfortune

答えて

4
from collections import Counter 

# create the counter, from most common to least common. reverse it, and get the first item. 
item, num = Counter(b['Item'] for b in bookings).most_common()[::-1][0] 

from collections import Counter 

c = Counter(b['Item'] for b in bookings) 
item = min(c, key=c.get) 
+0

説明のおかげで...うまく動作します – MFB

+0

ほとんどの場合、これはおそらくOKですが、 'item = min(c、key = c.get)'はやや効率的です(O 'most_common'はソートを実行するので(O(n log n))、ソートを実行します。 – senderle

1

import collections 
c = collections.Counter() 

for booking in bookings: 
    c[booking['Item']] += 1 

c.most_common()[:-2:-1] 
[('foo2', 1)] 
より効率的な(senderleの礼儀)
+0

'n'とは何ですか? – MFB

+0

申し訳ありませんが、それは私のテストから残っていました。 –

+0

ああ、心配はありません、 – MFB

関連する問題