循环的Python列表

时间:2017-01-12 12:57:01

标签: python python-3.x

这是一个函数,我看到按顺序在数组中找到唯一的项目,我是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)

3 个答案:

答案 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

将迭代四次,第一次i0z 1;下一次迭代i将是1z 4;下一次迭代i将是2z 2;下一次迭代i将为3z 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函数,它只发出由元素及其索引组成的列表列表。