Python list comprehension删除重复项

时间:2014-05-27 04:59:26

标签: python django

我想要hubcode_list中的独特元素。我可以通过

来做到这一点
hubcode_alarm_obj = HubAlarm.objects.all()
for obj in hubcode_alarm_obj:
    hubcode = obj.hubcode
    if hubcode not in hubcode_list:
        hubcode_list.append(hubcode)

我想使用列表理解。我正在尝试这个,但它说hubcode_list未定义,这是正确的错误。我怎样才能在hubcode_list

中添加唯一元素
hubcode_alarm_obj = HubAlarm.objects.all()
hubcode_list = [obj.hubcode for obj in hubcode_alarm_obj if obj.hubcode not in hubcode_list]

我也可以这样做: -

hubcode_list = list(set([obj.hubcode for obj in hubcode_alarm_obj]))

但是又设置了另一个操作。我可以在list-comprehension中使用if-statement吗?

2 个答案:

答案 0 :(得分:2)

由于您使用的是django,请让数据库为您进行过滤。它(到目前为止)是最快的选择:

objects = HubAlarm.objects.exclude(hubcode__in=hubcode_list)

有关详情,请参阅documentation

答案 1 :(得分:0)

你的答案是否定的。 List comprehension一次创建一个全新的列表,因此您无法检查是否存在某些内容:

>>> lst = [1, 2, 2, 4, 5, 5, 5, 6, 7, 7, 3, 3, 4]
>>> new = [item for item in lst if item not in new]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'new' is not defined
>>> 

因此,首选的单行使用list(set(...))

>>> lst = [1, 2, 2, 4, 5, 5, 5, 6, 7, 7, 3, 3, 4]
>>> list(set(lst))
[1, 2, 3, 4, 5, 6, 7]
>>> 

但是,在列表列表中,这不起作用:

>>> lst = [[1, 2], [1, 2], [3, 5], [6, 7]]
>>> list(set(lst))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> 

在这种情况下,请使用标准for循环和.append()