Python 列表推导去重

0 投票
2 回答
1575 浏览
提问于 2025-04-18 07:40

我想要在 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]))

但是使用集合又是另一种操作。我能否在列表推导式中使用 if语句 来实现呢?

2 个回答

0

你的答案是否定的。列表推导式一次性创建一个全新的列表,所以你不能检查某个东西是否存在:

>>> 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() 方法。

2

既然你在用Django框架,那就让数据库来帮你过滤数据吧。这样做会是最快的选择:

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

想了解更多,可以查看官方文档

撰写回答