在python lis中搜索

2024-09-24 02:19:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个动态列表:

 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…)的用户,列表字典中的每个字典都是配置文件。我想做这样的搜索(或比较):

^{pr2}$

我怎么能这样比较呢?在

提前谢谢


Tags: 列表字典job动态carcountrylistquestion
2条回答

这里我们可以使用^{}

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对列表中的单个项进行计数,因此我们这里要做的是使用列表理解从列表中提取单个项—因为问题似乎并不重要,给定您的示例,然后使用计数器对它们进行计数。请注意,这是一个相当复杂的列表理解,因为您的数据结构有点笨拙,您可能需要考虑更改它。然后返回:

^{pr2}$

如果您想选择单独的东西,您可以这样做,例如:

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

在不使用不同的数据结构的情况下,最好的办法是使用列表理解或一些相关的构造来过滤列表。(顺便说一句,“列出清单”毫无意义。你指的是“dict list”还是“list of 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'}}]

对于仅获取计数,可以执行以下操作以避免创建新列表:

^{pr2}$

相关问题 更多 >