【问题标题】:Search in a python list在 python 列表中搜索
【发布时间】:2012-03-05 12:50:01
【问题描述】:

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

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

我怎样才能进行这样的比较?

提前致谢

【问题讨论】:

  • 您还想执行哪些其他 (...) 搜索?
  • @Tichodroma ,如果有其他配置文件。 (如年龄、城市、国家)。感谢您的帮助。
  • 不要使用list 作为变量名。这样你就隐藏了原来的list 函数。
  • @pkit: list 是类型/类(取决于 2k 或 3k),而不是函数。
  • @nightcracker 也列为内置函数docs.python.org/library/functions.html#list

标签: python search dictionary comparison


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    这里我们可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-13
      • 2012-11-21
      • 2022-11-12
      • 2013-03-06
      • 2014-05-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多