我有一个像这样的动态列表:
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 :(得分: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