我要从以下列表中获取唯一值:
['nowplaying', 'PBS', 'PBS', 'nowplaying', 'job', 'debate', 'thenandnow']
我需要的输出是:
['nowplaying', 'PBS', 'job', 'debate', 'thenandnow']
此代码有效:
output = []
for x in trends:
if x not in output:
output.append(x)
print(output)
有没有更好的解决办法?
Tags:
如果我们需要保持元素的顺序,那么:
还有一个使用
reduce
且没有临时used
变量的解决方案更新-2019年3月
第三种解决方案,这是一种简洁的解决方案,但由于
.index
是O(n),所以速度有点慢。更新-2016年10月
另一个有
reduce
的解决方案,但这次没有.append
,这使得它更容易被人阅读和理解。注意:请记住,我们获得的可读性越高,脚本的性能就越差。
回答评论
因为@monica问了一个很好的问题“这是如何工作的?”。对于每个有问题的人来说。我将试着更深入地解释这是如何运作的,以及这里发生了什么巫术;)
所以她首先问:
好吧,它确实起作用了
问题是,我们只是没有在
unique
变量中获得所需的结果,而只是在used
变量中。这是因为在列表理解过程中.append
修改used
变量并返回None
。因此,为了将结果放入
unique
变量中,并且仍然使用与.append(x) if x not in used
相同的逻辑,我们需要将这个.append
调用移到列表理解的右侧,只需在左侧返回x
。但如果我们太天真了,就跟着:
我们将一无所获。
同样,这是因为
.append
方法返回None
,这使我们的逻辑表达式看起来如下:这基本上总是:
x
位于used
时,计算结果为False
x
不在used
中时,计算结果为None
。在这两种情况下(
False
/None
),这将被视为falsy
值,结果会得到一个空列表。但是为什么当
x
不在used
中时,它的计算结果是None
?有人可能会问。因为这就是Python的short-circuit操作符works的方式。
因此,当不使用时,下一部分或表达式将被求值(
x
(即当其True
used.append(x)
),其值将返回(None
)。但这就是我们想要的,为了从一个有重复项的列表中获得唯一的元素,我们想要
.append
它们只有在我们第一次遇到它们时才进入一个新的列表。所以我们真的想只在
x
不在used
的情况下计算used.append(x)
,也许有办法把这个None
值变成truthy
值,我们就没事了,对吧?是的,这里是第二种类型的
short-circuit
运算符开始使用的地方。我们知道
.append(x)
永远是falsy
,所以如果我们在他旁边加上一个or
,我们就会得到下一个部分。所以我们写:因此,只有当表达式的第一部分是^{
(x not in used)
时,我们才能对used.append(x)
进行求值并得到True
。在使用
reduce
方法的第二种方法中可以看到类似的方式。其中我们:
x
附加到l
并在x
不在l
中时返回l
。感谢or
语句.append
被求值,然后返回l
。x
在l
中时,返回l
未触及为了与我使用的类型一致:
首先正确地声明你的列表,用逗号隔开。可以通过将列表转换为集合来获取唯一值。
如果进一步将其用作列表,则应通过执行以下操作将其转换回列表:
另一种可能,可能更快的方法是从一开始就使用一个集合,而不是一个列表。那么你的代码应该是:
正如有人指出的那样,套数并不能维持原来的顺序。如果需要,应该寻找ordered set实现(有关更多信息,请参见this question)。
相关问题 更多 >
编程相关推荐