有人要求我复制枚举函数。也就是说,当给定一个 int 或 string 列表时,输出应该是每个元素及其索引的元组列表。
list entered = [1, 2, 3, 4]
expected outcome = [(0, 1), (1, 2), (2, 3), (3, 4)]
大部分情况下是可行的。重复元素时会出现此问题。
这是我的代码:
def my_enumerate(items):
""" return tuples with index and number"""
tuple_list = []
for i in items:
tuple_list.append((items.index(i), i))
return tuple_list
当输入包含重复元素的列表时,
ans = my_enumerate(['x', 'x', 'x'])
print(ans)
expected outcome : [ (0, 'x'), (1, 'x'), (2, 'x') ]
actual outcome : [ (0, 'x'), (0, 'x'), (0, 'x') ]
我应该对我的代码做哪些更改?
谢谢
您的问题是元素可以重复但索引是唯一的。此外,根据元素查找索引通常是O(n)
,而列表的重点是根据其索引获取元素,是O(1)
.
因此,不是迭代元素,而是迭代索引并获取元素:
def my_enumerate(items):
tuple_list = []
for i in range(len(items)):
tuple_list.append((i, items[i]))
return tuple_list
或者更简洁:
def my_enumerate(items):
return [(i, items[i]) for i in range(len(items))]
两者都给出:
>>> my_enumerate([1, 2, 3, 4])
[(0, 1), (1, 2), (2, 3), (3, 4)]
>>> my_enumerate(['x', 'x', 'x'])
[(0, 'x'), (1, 'x'), (2, 'x')]
为了使其更符合 enumerate
的 generator-y 精神,我们可以分别将函数更改为:
def my_enumerate(items):
for i in range(len(items)):
yield (i, items[i])
和:
def my_enumerate(items):
yield from ((i, items[i]) for i in range(len(items)))
现在您可以像常规 enumerate
一样对其进行迭代,或者如果您希望将其作为列表,只需执行以下操作:list(my_enumerate(items))
我是一名优秀的程序员,十分优秀!