我接受了这个练习:
编写一个函数
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")]
答案 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
代替xrange
和print(...)
代替print
答案 2 :(得分:0)
my_enumerate = lambda seq: zip(range(len(seq)), seq)
在Python 2.x中,您应该使用itertools.izip
和xrange
代替。
答案 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