2012-03-07 3 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 (파이썬의 MULTISET)과, 아니지만 특히 효율적으로, 쉽게 할 수
+2

이는 SQL인가 데이터 베이스? 그렇다면 select count distinct 쿼리로 필터링을 수행하는 것이 훨씬 빠릅니다. 모든 것을 파이썬으로 가져와야한다면 O (n)이 될 것입니다. SQL에서 파이썬으로 필요한 것보다 많은 데이터를 선택하는 비효율뿐만 아니라 전체 목록을 반복 할 수 있기 때문입니다. – rob05c

+0

NoSQL이지만 'distinct'가 있습니다. 질문해야 할 고유 한 가치에 대해 더 설명해 주시겠습니까? 미안해, 너를 아직 못마땅 해. – 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

대부분의 상황에서 이것은 아마 괜찮을 것입니다.하지만'item = min (c, key = c.get)'이 약간 더 효율적일 것입니다 (O (n)), 왜냐하면'most_common'은 sort (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