在python列表中搜索

时间:2012-03-05 12:50:02

标签: python search dictionary comparison

我有一个像这样的动态列表:

 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
...
...

我该如何进行这样的比较?

提前致谢

2 个答案:

答案 0 :(得分:3)

不使用不同的数据结构,最好的办法是使用列表推导或一些相关的构造来过滤列表。 (顺便说一句,“list dict”没有意义。你的意思是“dict list”或“dicts列表”?)也不要使用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

答案 1 :(得分: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()])

我已将list重命名为answers,以避免与内置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