【问题标题】:Writing a enumerate function using lambda使用 lambda 编写枚举函数
【发布时间】:2015-05-18 12:46:19
【问题描述】:

我收到了这个练习:

编写一个函数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")]

【问题讨论】:

  • 看起来应该返回一个以索引为键的字典。
  • 是我遗漏了什么还是你想重新发明enumerate() function
  • 或者,如果它必须是 lambda:my_enumerate = lambda L: list(ind,item for ind,item in enumerate(L))

标签: python lambda


【解决方案1】:

如果您实际上可以索引,只需通过索引添加值:

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

【讨论】:

  • 您的两个示例似乎完全不同-第一个期望列表的长度(并且列表本身也应该在范围内),第二个期望列表本身。为什么不lambda a: [(t, a[t]) for t in range(len(a))]
  • @jonrsharpe,粘贴了错误的代码。实际上无关紧要,因为 OP 无法索引
  • 我认为这意味着他们无法这样做,而不是被禁止这样做;你可能是对的。
【解决方案2】:
[(i,a[i])for i in range(len(a))]

【讨论】:

    【解决方案3】:
    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

    【讨论】:

    • @H_meir,我以为你说你不能索引?
    【解决方案4】:

    Python 的 ziprange 函数可以轻松解决这个问题。

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

    在 Python 2.x 中,您应该改用 itertools.izipxrange

    【讨论】:

      【解决方案5】:

      你也可以递归地做:

      >>> myenumerate = lambda l, n=0: [] if not l else (lambda ll = list(l): [(n, ll.pop(0))] + myenumerate(ll, n+1)()
      

      list.pop(n) 从列表中返回nth 值,并返回它。

      唯一的问题是你必须传入一个列表:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-26
        • 2014-10-08
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多