编写使用lambda
一个枚举函数我收到这个练习:编写使用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")]
如果你能真正指标只是通过索引添加值:
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))
您的两个示例看起来完全不同 - 第一个需要长度(列表本身也应该在范围内),列表本身也是第二个。为什么不在范围内(lambda(a))]'lambda a:[(t,a [t])? – jonrsharpe
@jonrsharpe,粘贴错误的代码。实际上无关紧要,因为OP无法编制索引 –
我认为这意味着他们无法这样做,而不是被禁止;你可能是对的。 – jonrsharpe
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
代替xrange
和print(...)
,而不是print
如果你使用python3
非常感谢,我不明白我怎么没有看到我的自我.... –
@H_meir,我以为你说你不能索引? –
Python的zip
和range
功能解决了这个问题相当得心应手。
my_enumerate = lambda seq: zip(range(len(seq)), seq)
在Python 2.x中,你应该使用itertools.izip
,并xrange
来代替。
你也可以做到这一点递归:
>>> 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')]
[(i,a[i])for i in range(len(a))]
看起来像它应该返回一个字典,索引键。 – duffymo
我错过了什么,或者你是否想重新发明['enumerate()'函数](https://docs.python.org/2/library/functions.html#enumerate)? –
you donwt missing –