Python 复制枚举函数的函数而不使用它
我被要求复制枚举函数。也就是说,当给定int或string列表时,输出应该是每个元素及其索引的元组列表 输入的列表=[1,2,3,4] 预期结果=[(0,1)、(1,2)、(2,3)、(3,4)] 这在很大程度上是可行的。当重复一个元素时,问题就会出现 这是我的代码: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:
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()