【问题标题】:set of dictionaries in list of dictionarys字典列表中的字典集
【发布时间】:2019-01-14 00:29:09
【问题描述】:

试图在列表中查找一组字典。

假设我有以下字典列表:

rm_dict = [{'name':'rick','subject':'adventure time mortttty buugh','body':['wubba lubba dub dubbb motha f*&^%!', 'morty get over here!']},
 {'name':'rick','subject':'adventure time mortttty buugh','body':['wubba lubba dub dubbb motha f*&^%!', 'morty get over here!']},
 {'name':'morty','subject':'re:adventure time mortttty buugh','body':['youre drunk rick!', 'I'm going to get mom', 'you always do this']}]

只尝试set,我得到一个错误。

set(rm_dict)

我获取消息/电子邮件的正文,因为这是我将用来定义唯一性的内容,并创建所有电子邮件正文的列表,然后我将为set(tuple()) 等创建一个生成器..

list_of_body = [x['body'] for x in rm_dict]
>>[['wubba lubba dub dubbb motha f*&^%!'],
  ['wubba lubba dub dubbb motha f*&^%!'],
  ['youre drunk rick!']]

[list(item) for item in set(tuple(row) for row in list_of_body)]
>>[['wubba lubba dub dubbb motha f*&^%!'], ['youre drunk rick!']]

这成功地让我从list_of_body 中获得了唯一的机构,但我想要原始列表中的整个字典。

【问题讨论】:

    标签: python dictionary set


    【解决方案1】:

    设置项必须是可散列的,而字典不是。您可以使用pickle 序列化所有dicts,然后使用set 获取唯一项,最后将它们反序列化回dicts:

    import pickle
    print(list(map(pickle.loads, set(map(pickle.dumps, rm_dict)))))
    

    这个输出:

    [{'name': 'morty', 'subject': 're:adventure time mortttty buugh', 'body': ['youre drunk rick!']}, {'name': 'rick', 'subject': 'adventure time mortttty buugh', 'body': ['wubba lubba dub dubbb motha f*&^%!']}]
    

    【讨论】:

      【解决方案2】:

      您的错误消息告诉您一些重要的事情:字典或列表都不是可散列的,因此不能用作集合的成员。解决此问题的一种方法是使用 str,它是数据中电子邮件正文的第 0 个元素。

      您可以通过列表理解根据其中一个键“唯一化”您的列表:

      >>> seen = set()
      >>> [i for i in rm_dict if i['body'][0] not in seen and not seen.add(i['body'][0])]
      [{'name': 'rick',
        'subject': 'adventure time mortttty buugh',
        'body': ['wubba lubba dub dubbb motha f*&^%!']},
       {'name': 'morty',
        'subject': 're:adventure time mortttty buugh',
        'body': ['youre drunk rick!']}]
      

      这是另一种形式,没有理解:

      >>> seen = set()
      >>> emails = []
      >>> for i in rm_dict:
      ...     body = i['body'][0]
      ...     if body not in seen:
      ...         emails.append(i)
      ...         seen.add(body)
      ...         
      
      >>> emails
      [{'name': 'rick',
        'subject': 'adventure time mortttty buugh',
        'body': ['wubba lubba dub dubbb motha f*&^%!']},
       {'name': 'morty',
        'subject': 're:adventure time mortttty buugh',
        'body': ['youre drunk rick!']}]
      

      【讨论】:

      • 我的示例有点错误,因为我的body 是多个字符串的列表,而不仅仅是 1。因此将其转换为元组并使用您的代码修复它。谢谢!
      猜你喜欢
      • 2021-10-17
      • 2019-02-13
      • 2014-10-15
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      相关资源
      最近更新 更多