繁体   English   中英

使用 Python 从列表中删除特定重复项

[英]Remove specific duplicates from list with Python

假设我有一个对象列表,我想在其中删除具有相同id重复项,然后保留具有public: true

recipes = [
       {'id': 1, 'public': True}, 
       {'id': 1, 'public': False}, 
       {'id': 2, 'public': False}, 
       {'id': 3, 'public': True},
       {'id': 3, 'public': False}
    ]

list_ = []
[list_.append(r) for r in recipes if r.id not in list_]

print(list_)

要添加的第二个条件是什么?

想要的结果:

    recipes = [
       {'id': 1, public: True},  
       {'id': 2, public: False}, 
       {'id': 3, public: True},
    ]

您可以使用count来检查条目是否重复。

recipes = [
   {'id': 1, 'public': True}, 
   {'id': 1, 'public': False}, 
   {'id': 2, 'public': False}, 
   {'id': 3, 'public': True},
   {'id': 3, 'public': False}
]

list = []
[list.append(r) for r in recipes if [i['id'] for i in recipes].count (r['id']) == 1 or r['public']]

return list

这个答案有 O(n) 时间,希望足够了:

ids={}  # Use a set to check for dups
l=[]    # Answer list
for i in recipes: # O(n) time
    if i['id'] in ids:
        if i['public']:
              ids[i['id']]=i
    else:
        ids[i['id']]=len(l)  # renumber the index for later O(1) use
                             # len(l) is a O(1) function, so no need to keep a counter
        l.append(i)

对不起,这不是单线,但我认为这是一个很好的做法:)

您可以首先根据'public'键以相反的顺序对列表进行排序,以便所有'public': True条目都在顶部。 然后进行列表理解以按顺序过滤掉唯一的'id'值:

recipes = [{'id': 1, 'public': True}, 
           {'id': 1, 'public': False}, 
           {'id': 2, 'public': False}, 
           {'id': 3, 'public': True},
           {'id': 3, 'public': False}]

recipes.sort(key = lambda r: r['public'], reverse=True)

recipes_unique = []
[recipes_unique.append(r) for r in recipes if 
    r['id'] not in [s['id'] for s in recipes_unique]]

display(recipes_unique)

这将提供所需的结果(如有必要,您当然可以再次按'id'排序):

[{'id': 1, 'public': True},
 {'id': 3, 'public': True},
 {'id': 2, 'public': False}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM