搜索

2012-03-05 46 views
0

我有一個動態的名單如下:搜索

list = [{'Question 1': {'Job': 'job1', 'Country': 'USA', 'Car': 'Porche'}}, 
     {'Question 1': {'Job': 'job2', 'Country': 'UK', 'Car': 'Nissan'}}, 
     {'Question 3': {'Job': 'job8', 'Country': 'GR', 'Car': 'Toyota'}}, 
     {'Question 4': {'Job': 'job1', 'Country': 'USA', 'Car': 'Toyota'}}, 
     {'Question 4': {'Job': 'job5', 'Country': 'USA', 'Car': 'Toyota'}}, 
     {'Question 4': {'Job': 'job5', 'Country': 'USA', 'Car': 'Porche'}}, 
     ] 

在列表中的每個詞典是回答問題用戶(問題1,問題2,...),並在列表中的每個字典詞典個人資料。我想這樣搜索(或比較):

Number of users that answer the Question 4 :3 
Countries : 3 From USA 
Car : 2 Toyota, 1 porche 
Job : 2 job5, 1 job 1 
... 
... 

我該如何進行比較?

在此先感謝

+0

其他什麼('...' )你想要執行的搜索? – 2012-03-05 12:52:41

+0

@Tichodroma,如果有其他配置文件項目。 (如年齡,城市,國家)。感謝幫助。 – TheNone 2012-03-05 12:54:12

+0

不要使用'list'作爲變量名稱。這樣你就隱藏了原來的'list'函數。 – pkit 2012-03-05 12:54:31

回答

1

這裏我們可以使用collections.Counter

from collections import Counter 

answers = [ 
    {'Question 1': {'Job': 'job1', 'Country': 'USA', 'Car': 'Porche'}}, 
    {'Question 1': {'Job': 'job2', 'Country': 'UK', 'Car': 'Nissan'}}, 
    {'Question 3': {'Job': 'job8', 'Country': 'GR', 'Car': 'Toyota'}}, 
    {'Question 4': {'Job': 'job1', 'Country': 'USA', 'Car': 'Toyota'}}, 
    {'Question 4': {'Job': 'job5', 'Country': 'USA', 'Car': 'Toyota'}}, 
    {'Question 4': {'Job': 'job5', 'Country': 'USA', 'Car': 'Porche'}}, 
] 

counted = Counter([item for q in answers for answer in q.values() for item in answer.items()]) 

我已經改名爲listanswers以避免與內建的list()混淆。

Counter統計列表中的單個項目,因此我們在這裏執行的操作是使用列表理解從列表中提取單個項目 - 因爲問題似乎並不重要,給出您的示例,然後使用反算他們。請注意,這是相當複雜的列表理解,因爲您的數據結構有點尷尬,您可能需要考慮更改它。這則返回:

Counter({ 
    ('Country', 'USA'): 4, 
    ('Car', 'Toyota'): 3, 
    ('Job', 'job5'): 2, 
    ('Job', 'job1'): 2, 
    ('Car', 'Porche'): 2, 
    ('Job', 'job8'): 1, 
    ('Job', 'job2'): 1, 
    ('Country', 'UK'): 1, 
    ('Car', 'Nissan'): 1, 
    ('Country', 'GR'): 1 
}) 

如果您想選擇個性的東西,你可以做,例如:

countries = [(key, value) for (key, value) in counted.items() if key[0] == "Country"] 

這給了我們:

[ 
    (('Country', 'UK'), 1), 
    (('Country', 'GR'), 1), 
    (('Country', 'USA'), 4) 
] 

如果你需要算回答所述問題的用戶數量,通過改變列表理解選出的內容來簡單地改變計數器的焦點,例如:

countedQuestions = Counter([question for q in answers for question in q]) 

這給了我們:

Counter({ 
    'Question 4': 3, 
    'Question 1': 2, 
    'Question 3': 1 
}) 

而且Counter對象是dict樣,所以你可以用它們當作一個dict

print("Number of users that answer Question 4:", countedQuestions['Question 4']) 
Number of users that answer Question 4: 3 
3

不使用不同的數據結構,最好的辦法是用一個列表理解,或者一些相關結構,過濾列表。 (順便說一下,「list dict」是沒有意義的,你的意思是「dict list」還是「dicts list」?)也不要用list作爲變量名;它掩蓋了一個內置函數。

>>> l = [{'Question 1': {'Job': 'job1', 'Country': 'USA', 'Car': 'Porche'}}, 
...  {'Question 1': {'Job': 'job2', 'Country': 'UK', 'Car': 'Nissan'}}, 
...  {'Question 3': {'Job': 'job8', 'Country': 'GR', 'Car': 'Toyota'}}, 
...  {'Question 4': {'Job': 'job1', 'Country': 'USA', 'Car': 'Toyota'}}, 
...  {'Question 4': {'Job': 'job5', 'Country': 'USA', 'Car': 'Toyota'}}, 
...  {'Question 4': {'Job': 'job5', 'Country': 'USA', 'Car': 'Porche'}}, 
...  ] 
>>> [d for d in l if 'Question 1' in d] 
[{'Question 1': {'Country': 'USA', 'Job': 'job1', 'Car': 'Porche'}}, 
{'Question 1': {'Country': 'UK', 'Job': 'job2', 'Car': 'Nissan'}}] 

對於只得到計數,你可以做這樣的事情,以避免產生新的列表:

>>> sum('Question 1' in d for d in l) 
2