2015-05-18 30 views
3

一个枚举函数我收到这个练习:编写使用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")] 
+0

看起来像它应该返回一个字典,索引键。 – duffymo

+1

我错过了什么,或者你是否想重新发明['enumerate()'函数](https://docs.python.org/2/library/functions.html#enumerate)? –

+0

you donwt missing –

回答

2

如果你能真正指标只是通过索引添加值:

my_enumerate = lambda x :[(t, x[t]) for t in range(len(x))] 
print list(my_enumerate(a)) 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'a'), (4, 'b'), (5, 'c')] 

如果不使用压缩,并把范围在lambda:

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

您的两个示例看起来完全不同 - 第一个需要长度(列表本身也应该在范围内),列表本身也是第二个。为什么不在范围内(lambda(a))]'lambda a:[(t,a [t])? – jonrsharpe

+0

@jonrsharpe,粘贴错误的代码。实际上无关紧要,因为OP无法编制索引 –

+0

我认为这意味着他们无法这样做,而不是被禁止;你可能是对的。 – jonrsharpe

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')] 

编辑:使用range代替xrangeprint(...),而不是print如果你使用python3

+0

非常感谢,我不明白我怎么没有看到我的自我.... –

+0

@H_meir,我以为你说你不能索引? –

0

Python的ziprange功能解决了这个问题相当得心应手。

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

在Python 2.x中,你应该使用itertools.izip,并xrange来代替。

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')] 
0
[(i,a[i])for i in range(len(a))]