使用lambda编写枚举函数

时间:2015-05-18 12:46:19

标签: python lambda

我接受了这个练习:

  

编写一个函数enumerate,它接受​​一个列表并返回一个列表   列表中每个项目包含(index,item)的元组

我的问题是我无法在一个或for个循环的组合中插入索引和值。这是我设法制作的代码:

a = ["a", "b", "c","a","b","c"]
index = 0
for i in a:
    print (index,i)
    index+=1

这大致是我想要制作的代码(必须在一行上):

my_enumerate = lambda x :[(t) for t in x )]
print list(my_enumerate(range(4)))

如何将lambda行全部放回(value, index)?输出应如下所示:

[(0, "a"), (1, "b"), (2, "c")]

5 个答案:

答案 0 :(得分:2)

如果您可以实际索引,只需通过索引添加值:

my_enumerate = lambda x: zip(range(len(x), x))
print list(my_enumerate(a))

如果不使用zip并在lambda中放置范围:

{{1}}

答案 1 :(得分:0)

my_enumerate = lambda x: [(i, x[i]) for i in xrange(len(x))]
a = ["a", "b", "c", "a", "b", "c"]
print my_enumerate(a)

输出:

[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'a'), (4, 'b'), (5, 'c')]

编辑:如果您使用的是python3,请使用range代替xrangeprint(...)代替print

答案 2 :(得分:0)

Python的ziprange函数很容易解决这个问题。

my_enumerate = lambda seq: zip(range(len(seq)), seq)

在Python 2.x中,您应该使用itertools.izipxrange代替。

答案 3 :(得分:0)

您也可以递归地执行此操作:

>>> myenumerate = lambda l, n=0: [] if not l else (lambda ll = list(l): [(n, ll.pop(0))] + myenumerate(ll, n+1)()

list.pop(n)从列表中返回n值,并将其返回。

唯一的问题是你必须传递一个列表:

>>> myenumerate([1,2,3,4,5,6,7,8])
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8)]
>>> myenumerate("astring")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
AttributeError: 'str' object has no attribute 'pop'
>>> myenumerate(list("astring"))
[(0, 'a'), (1, 's'), (2, 't'), (3, 'r'), (4, 'i'), (5, 'n'), (6, 'g')]

但是,如果您只是盲目地添加了对list的调用,则无法在不使用切片的情况下复制所需的功能。

绕过这个要求的巧妙方法是使用另一个lambda:

>>> myenumerate = lambda l, n=0: [] if not l else (lambda ll: [(n, ll.pop(0))] + myenumerate(ll, n+1))(list(l))

>>> myenumerate("astring")
[(0, 'a'), (1, 's'), (2, 't'), (3, 'r'), (4, 'i'), (5, 'n'), (6, 'g')]

答案 4 :(得分:0)

return