[英]Writing a enumerate function using 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
線都放到get (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')]
如果不使用zip並在lambda中放置范圍:
my_enumerate = lambda x: zip(range(len(x), x))
print list(my_enumerate(a))
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
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))]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.