词典列表中的词典集

2024-10-02 12:32:43 发布

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

试图在列表中找到一组词典。你知道吗

假设我有以下词典列表:

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)

我获取消息/电子邮件的正文,因为我将使用它来定义为unique,并创建所有电子邮件正文的列表,然后我将为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中获得了唯一的主体,但是我想要原始列表中的整个字典。你知道吗


Tags: rmname列表bodydubdictlistsubject
2条回答

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

您可以基于列表的一个键“uniqify”列表:

>>> 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!']}]

集合项必须是可哈希的,而dict不是。您可以使用pickle序列化所有dict,然后使用set获取唯一项,最后将它们反序列化回dict:

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*&^%!']}]

相关问题 更多 >

    热门问题