如何删除dictionary列表中的重复元素



我有一个包含5个字典的列表,我想用id过滤它们。如果他们有相同的id,我会删除它。我试过这样的东西,但它不起作用

res = []
for y in self.dict_trie_csv_infos:
#check if  same 'event_id' before
if float(y['event_id']) not in res:
res.append(y)

dicts的id是";1〃"2〃"3〃"4〃"4〃;。

只有id不同,我必须删除它。我也试着做了一个双循环,但没有成功。

当我做print(len(self.dict_trie_csv_infos)时,它会给我5当我打印CCD_ 2时也是如此。

这是我的第一个元素:

{'event_id': 1,
'collection_name': 'Mouse On',
'smart_contract': {'multisig': 'KT1Aer6TxNwoMJejoqsNP8TEN7J6STgMtJcA',
'sale_params': {
'is_presale': False,
'metadata_list': [],
'price_per_token': 4,
'max_mint_per_user': 5,
'sale_size': 500,
'sale_currency': {'xtz': None},
'start_time': 1656626400,
'end_time': 1657490400,
}}}

这里有一种方法可以满足您的问题:

class Foo:
def __init__(self):
dict_trie_csv_infos = []
def remove_duplicate_ids(self):
res = []
ids = set()
for y in self.dict_trie_csv_infos:
if y['event_id'] not in ids:
ids.add(y['event_id'])
res.append(y)
return res

f = Foo()
f.dict_trie_csv_infos = [
{'event_id': 1, 'collection_name': 'Mouse On', 'smart_contract': {'multisig': 'KT1Aer6TxNwoMJejoqsNP8TEN7J6STgMtJcA', 'sale_params': {'is_presale': False, 'metadata_list': [], 'price_per_token': 4, 'max_mint_per_user': 5, 'sale_size': 500, 'sale_currency': {'xtz': None}, 'start_time': 1656626400, 'end_time': 1657490400}}},
{'event_id': 2, 'collection_name': 'Mouse On', 'smart_contract': {'multisig': 'KT1Aer6TxNwoMJejoqsNP8TEN7J6STgMtJcA', 'sale_params': {'is_presale': False, 'metadata_list': [], 'price_per_token': 4, 'max_mint_per_user': 5, 'sale_size': 500, 'sale_currency': {'xtz': None}, 'start_time': 1656626400, 'end_time': 1657490400}}},
{'event_id': 3, 'collection_name': 'Mouse On', 'smart_contract': {'multisig': 'KT1Aer6TxNwoMJejoqsNP8TEN7J6STgMtJcA', 'sale_params': {'is_presale': False, 'metadata_list': [], 'price_per_token': 4, 'max_mint_per_user': 5, 'sale_size': 500, 'sale_currency': {'xtz': None}, 'start_time': 1656626400, 'end_time': 1657490400}}},
{'event_id': 4, 'collection_name': 'Mouse On', 'smart_contract': {'multisig': 'KT1Aer6TxNwoMJejoqsNP8TEN7J6STgMtJcA', 'sale_params': {'is_presale': False, 'metadata_list': [], 'price_per_token': 4, 'max_mint_per_user': 5, 'sale_size': 500, 'sale_currency': {'xtz': None}, 'start_time': 1656626400, 'end_time': 1657490400}}},
{'event_id': 4, 'collection_name': 'Mouse On', 'smart_contract': {'multisig': 'KT1Aer6TxNwoMJejoqsNP8TEN7J6STgMtJcA', 'sale_params': {'is_presale': False, 'metadata_list': [], 'price_per_token': 4, 'max_mint_per_user': 5, 'sale_size': 500, 'sale_currency': {'xtz': None}, 'start_time': 1656626400, 'end_time': 1657490400}}}
]
res = f.remove_duplicate_ids()
[print(elem, 'n') for elem in res]

输出:

{'event_id': 1, 'collection_name': 'Mouse On', 'smart_contract': {'multisig': 'KT1Aer6TxNwoMJejoqsNP8TEN7J6STgMtJcA', 'sale_params': {'is_presale': False, 'metadata_list': [], 'price_per_token': 4, 'max_mint_per_user': 5, 'sale_size': 500, 'sale_currency': {'xtz': None}, 'start_time': 1656626400, 'end_time': 1657490400}}}
{'event_id': 2, 'collection_name': 'Mouse On', 'smart_contract': {'multisig': 'KT1Aer6TxNwoMJejoqsNP8TEN7J6STgMtJcA', 'sale_params': {'is_presale': False, 'metadata_list': [], 'price_per_token': 4, 'max_mint_per_user': 5, 'sale_size': 500, 'sale_currency': {'xtz': None}, 'start_time': 1656626400, 'end_time': 1657490400}}}
{'event_id': 3, 'collection_name': 'Mouse On', 'smart_contract': {'multisig': 'KT1Aer6TxNwoMJejoqsNP8TEN7J6STgMtJcA', 'sale_params': {'is_presale': False, 'metadata_list': [], 'price_per_token': 4, 'max_mint_per_user': 5, 'sale_size': 500, 'sale_currency': {'xtz': None}, 'start_time': 1656626400, 'end_time': 1657490400}}}
{'event_id': 4, 'collection_name': 'Mouse On', 'smart_contract': {'multisig': 'KT1Aer6TxNwoMJejoqsNP8TEN7J6STgMtJcA', 'sale_params': {'is_presale': False, 'metadata_list': [], 'price_per_token': 4, 'max_mint_per_user': 5, 'sale_size': 500, 'sale_currency': {'xtz': None}, 'start_time': 1656626400, 'end_time': 1657490400}}}

说明:

  • 为了测试,创建一个简单的类Foo,该类具有实例属性dict_trie_csv_infos和实例方法remove_duplicate_ids
  • 创建类型为Foo的变量f,并分配一个包含dict元素的列表,如问题中的示例,其中event_id的值为1、2、3、4和4
  • 致电f.remove_duplicate_ids()
  • 在包含问题中代码的修改版本的remove_duplicate_ids()中,使用名为idsset来检测重复项,并构建结果变量res以包含具有唯一event_id值的行

看起来第一个列表中的每个对象都被添加到第二个列表中。这是因为float(y['event_id']) not in res总是对True求值。

你可能想试试之类的东西

res = []
for y in self.dict_trie_csv_infos:
# check if  same 'event_id' before
found = False
for x in res:
if y['event_id'] == x['event_id']:
found = True
break
if(not found)
res.append(y)

最新更新