Python 复制枚举函数的函数而不使用它

Python 复制枚举函数的函数而不使用它,python,Python,我被要求复制枚举函数。也就是说,当给定int或string列表时,输出应该是每个元素及其索引的元组列表 输入的列表=[1,2,3,4] 预期结果=[(0,1)、(1,2)、(2,3)、(3,4)] 这在很大程度上是可行的。当重复一个元素时,问题就会出现 这是我的代码: def my_enumerate(items): """ return tuples with index and number""" tuple_list = [] for i in items:

我被要求复制枚举函数。也就是说,当给定int或string列表时,输出应该是每个元素及其索引的元组列表

输入的列表=[1,2,3,4]

预期结果=[(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)
预期结果:[(0,'x'),(1,'x'),(2,'x')]

实际结果:[(0,'x'),(0,'x'),(0,'x')]

我应该对代码做哪些更改


谢谢

您的问题是元素可以重复,但索引是唯一的。此外,根据元素查找索引通常是
O(n)
,而列表的要点是根据元素的索引获取元素,即
O(1)

因此,不是迭代元素,而是迭代索引并获取元素:

def my_枚举(项目):
元组列表=[]
对于范围内的i(len(items)):
tuple_list.append((i,items[i]))
返回元组列表
或者更简洁地说:

def my_枚举(项目):
返回范围(len(items))中i的[(i,items[i])]
两者都给出:

>>我的枚举([1,2,3,4])
[(0, 1), (1, 2), (2, 3), (3, 4)]
>>>my_枚举(['x','x','x']))
[(0,'x'),(1,'x'),(2,'x')]

为了使其更符合
enumerate
的generator-y精神,我们可以分别将函数更改为:

def my_枚举(项目):
对于范围内的i(len(items)):
收益率(i,项目[i])
以及:

def my_枚举(项目):
范围(len(items))内i的((i,items[i])收益率

现在,您可以像常规的
枚举
一样迭代它,或者如果您希望它作为一个列表,只需执行以下操作:
列表(我的枚举(项))

您的问题是元素可以重复,但索引是唯一的。此外,根据元素查找索引通常是
O(n)
,而列表的要点是根据元素的索引获取元素,即
O(1)

因此,不是迭代元素,而是迭代索引并获取元素:

def my_枚举(项目):
元组列表=[]
对于范围内的i(len(items)):
tuple_list.append((i,items[i]))
返回元组列表
或者更简洁地说:

def my_枚举(项目):
返回范围(len(items))中i的[(i,items[i])]
两者都给出:

>>我的枚举([1,2,3,4])
[(0, 1), (1, 2), (2, 3), (3, 4)]
>>>my_枚举(['x','x','x']))
[(0,'x'),(1,'x'),(2,'x')]

为了使其更符合
enumerate
的generator-y精神,我们可以分别将函数更改为:

def my_枚举(项目):
对于范围内的i(len(items)):
收益率(i,项目[i])
以及:

def my_枚举(项目):
范围(len(items))内i的((i,items[i])收益率

现在,您可以像常规的
枚举
一样对其进行迭代,或者如果您想将其作为列表,只需执行以下操作:
列表(我的枚举(项目))
如果您想:

def my_enumerate(items):
    return list(zip(range(len(items)),items))

虽然如果您使用更原始的元素再现(部分)enumerate的功能,使用
zip
可能有违问题的本质(在这种情况下,最好使用Tomerikoo的解决方案)。然而,知道解决问题的多种方法并没有什么坏处。

如果您愿意,您可以使用
zip

def my_enumerate(items):
    return list(zip(range(len(items)),items))

虽然如果您使用更原始的元素再现(部分)enumerate的功能,使用
zip
可能有违问题的本质(在这种情况下,最好使用Tomerikoo的解决方案)。然而,知道解决问题的多种方法并没有坏处。

你的问题是
索引
总是找到第一次出现的
'x'
的索引。一个想法是使用int索引而不是index方法

for i in range(len(items)):
    tuple_list.append((i, items[i]))

您的问题是
索引
总是查找第一次出现的
'x'
的索引。一个想法是使用int索引而不是index方法

for i in range(len(items)):
    tuple_list.append((i, items[i]))

太复杂了。为什么要这样使用
.index()
?只需对范围内的i使用一个简单的for循环
(len(list_entered)):..
太复杂了。为什么要这样使用
.index()
?只需对范围内的i使用一个简单的for循环
(len(list_entered)):..
更好的方法是返回一个生成器而不是列表,例如对范围内的i(len(items))使用
((i,items[i]))
。这更符合
enumerate
的惰性本质。如果你真的需要一个列表,那么在上面调用
list
,或者对idx迭代
,我的枚举(items)中的值:…
谢谢alot@jpp这与
enumerate
更加一致,并且更准确地复制了行为,更好的是返回一个生成器而不是列表,例如,对范围内的i(len)返回
((i,items[i])(items))
。这更符合
枚举
的惰性本质。如果您确实需要列表,请在其上调用
列表
,或者在my_enumerate(items)中对idx值迭代
:…
非常感谢@jpp这与
enumerate
更为一致,并且更准确地复制了jpp对我的答案的评论,为了使其与enumerate一致,您可以省略
列表(…)
,因为
zip
返回一个迭代器。然后,如果必要,可以调用
list()
函数外部jpp对我的答案发表了评论,为了使其与enumerate一致,您可以省略
列表(…)
,因为
zip
返回一个迭代器。然后,如果需要,可以在fu外部调用
list()