从命名偶列表中删除重复项

2024-03-28 21:49:24 发布

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

由于我的Javascript背景,我经常对列表和元组感到困惑,请原谅

我有一个名为tuples的列表,如下所示:

[AdminInfo(username='abc', is_admin=False), AdminInfo(username='cde', is_admin=False), AdminInfo(username='efg', is_admin=False), AdminInfo(username='hij', is_admin=True), AdminInfo(username='jkl', is_admin=False), AdminInfo(username='abc', is_admin=False), AdminInfo(username='xyz', is_admin=False)]

我正试图从这里删除重复的内容。对于简单的列表,我可以这样做

a = list(set(<var>))

但在这种情况下,我们似乎无法转换为set。如果我尝试,它将失败并出现错误:

TypeError: unhashable type: 'AdminInfo'

有人能帮我从上面的列表中删除重复项吗


Tags: false列表adminisusernamejavascript元组背景
3条回答

下面是您需要的代码片段:

import numpy
class AdminInfo:
    def __init__(self, **kwargs):
        [setattr(self, key, kwargs[key]) for key in kwargs]

def remove_duplicated(l):
    numpy.array(l)[numpy.unique(numpy.array([user.username for user in l]), return_index=True)[1]].tolist()

if __name__ == '__main__':
    start_list = [
        AdminInfo(username='abc', is_admin=False), 
        AdminInfo(username='cde', is_admin=False), 
        AdminInfo(username='efg', is_admin=False), 
        AdminInfo(username='hij', is_admin=True), 
        AdminInfo(username='jkl', is_admin=False), 
        AdminInfo(username='abc', is_admin=False), 
        AdminInfo(username='xyz', is_admin=False)
    ]
    final_list = remove_duplicated(start_list)
        
    assert len(start_list) == len(final_list) + 1
    assert [user.username for user in start_list].count("abc") == 2
    assert [user.username for user in final_list].count("abc") == 1

使用numpy阵列,此解决方案更适合于大量数据

从每个类中提取名称,如果已选中的类的列表已包含该类,则进行检查

class AdminInfo:
    name = None

    def is_admin(self):
        return self.val_is_admin

    def __init__(self, username='Undefined', is_admin=False):
        self.val_is_admin = is_admin
        self.name = username

ai_list = [AdminInfo(username='abc', is_admin=False), AdminInfo(username='cde', is_admin=False),
           AdminInfo(username='efg', is_admin=False), AdminInfo(username='hij', is_admin=True),
           AdminInfo(username='jkl', is_admin=False), AdminInfo(username='abc', is_admin=False),
           AdminInfo(username='xyz', is_admin=False)]

if __name__ == '__main__':
    names = []
    n_list = []
    for i in ai_list:
        if i.name not in names:
            names.append(i.name)
            n_list.append(i)
    print(names)

我认为您感到困惑,因为您需要一个基于username属性值的唯一AdminInfo对象的列表。在代码中,您创建了一个包含八个唯一AdminInfo对象的列表,其中两个对象共享相同的名称

这段代码应该给你我认为你在寻找的东西。它将返回具有给定用户名的每个AdminInfo对象的最后一个实例的列表。它利用了这样一个事实:如果向字典添加重复键,新值将覆盖旧值

ai_list = [AdminInfo(username='abc', is_admin=False), AdminInfo(username='cde', is_admin=False), AdminInfo(username='efg', is_admin=False), AdminInfo(username='hij', is_admin=True), AdminInfo(username='jkl', is_admin=False), AdminInfo(username='abc', is_admin=False), AdminInfo(username='xyz', is_admin=False)]
ai_dict = dict((item.name, item) for item in ai_list)
ai_list = list(ai_dict.values())

相关问题 更多 >