这是一个函数,我看到按顺序在数组中找到唯一的项目,我是python的新手,但这看起来非常优雅。
unique_in_order = lambda l: [z for i, z in enumerate(l) if i == 0 or l[i - 1] != z]
这对于循环完全的工作原理如何。
z for i,z in enumerate(l)
答案 0 :(得分:1)
enumerate(..)
是一个内置函数,它将可迭代对象(此处为l
)作为输入,并生成包含索引和每个元素的元素的元组序列。
因此enumerate([1,4,2,5])
会发出(0,1)
,(1,4)
,(2,2)
,(3,5)
等元组。如果在for
循环的头部使用以逗号分隔的标识符列表,则元组将被取消。所以:
for i,z in enumerate([1,4,2,5]):
pass
将迭代四次,第一次i
将0
和z
1;下一次迭代i
将是1
和z
4;下一次迭代i
将是2
和z
2;下一次迭代i
将为3
和z
5。
现在,您的语句还包含一些列表理解,z
中的第一个z for i,z in enumerate(l)
表示它将发出z
值。另请注意,有条件(if
部分),因此不会发出所有值。
答案 1 :(得分:0)
enumerate()可以帮助您一次迭代索引和序列项。
以下是一个例子:
>>> l=['a','b','c']
>>> for index,value in enumerate(l):
print (index,value)
0 a
1 b
2 c
您发布的解决方案是错误的,并且不会返回唯一元素,因为它只检查前一项目上的重复项(l[i-1]!=z
)。
详细说明我的意思,这是一个试运行:
>>> unique_in_order = lambda l: [z for i, z in enumerate(l) if i == 0 or l[i - 1] != z]
>>> l=[1,1,123,5,6,123]
>>> unique_in_order(l)
[1, 123, 5, 6, 123]
您可以看到123
出现两次,因为它仅针对其上一个元素6
进行了测试。
在我提供一个简单的解决方案之前,我们需要明确我们正在按顺序从列表中找到唯一的项目,或者我们正试图完全摆脱重复项。
一个简单而优雅的解决方案是使用list.count
方法。它返回项目在列表中出现的次数。
>>> l=['a', 'a',2,5,6,'b', 'c', 'd', 'e','e',2,2,6]
>>> [x for x in l if l.count(x)<2]
[5, 'b', 'c', 'd']
如果您不打算完全丢弃重复项,而是希望列表只出现重复项,那么您可以这样做:
>>> l=['a', 'a',2,5,6,'b', 'c', 'd', 'e','e',2,2,6]
>>> dups=set()
>>> [x for x in l if x not in dups and (dups.add(x) or True)]
['a', 2, 5, 6, 'b', 'c', 'd', 'e']
答案 2 :(得分:0)
你应该从python中的list comprehensions概念开始,以了解这个lambda函数的作用。简而言之,它创建满足语句右侧条件的z
元素列表。
另一个重要的事情是内置enumerate函数,它只发出由元素及其索引组成的列表列表。