簡體   English   中英

使用lambda編寫枚舉函數

[英]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而不是xrangeprint(...)而不是print

Python的ziprange函數非常方便地解決了這個問題。

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

在Python 2.x中,您應該使用itertools.izipxrange

你也可以遞歸地做:

>>> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM