Skip to main content
 首页 » 编程设计

python之复制枚举函数的功能而不使用它

2025年05月04日16jillzhang

有人要求我复制枚举函数。也就是说,当给定一个 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))