如何在不实际使用枚举的情况下编写功能类似于枚举的代码?

How to make code that's functionally similar to enumerate without actually using enumerate?

我想写一个代码来打印出给定列表中出现两次的数字的值,但它们不允许我们在 python 上使用内置函数。如果不使用枚举,我将如何编写它?

def find_second_occurrence(xs,v):
    count = 0
    value = None
    for i, x in enumerate(xs):
        if v == x:
            count += 1
            if count == 2:
                return i
    if (count < 2):
        return value

enumerate(sequence) 与以下形式的构造非常相似:

for i in range(len(sequence)):
    # get sequence[i] and return i and sequence[i] for all i's

因此,在您的代码中,完全替换 enumerate 可以通过以下方式完成:

for i in range(len(xs)):
    x = xs[i]             
    if v == x:
        count += 1
        if count == 2:
            return i

或者,不指定 x 名称来临时保存序列项:

for i in range(len(xs)):           
    if v == xs[i]:
        count += 1
        if count == 2:
            return i

创建一个 my_enumerate 函数也很简单:

def my_enumerate(sequence, start=0):
    for i in range(len(sequence)):
        yield start+i, sequence[i]

start 也被定义为与 enumerate 中使用的匹配,并获得默认值 0.

而不是 yielding 值(如果这对你来说很神秘),你可以创建一个列表(生成器理解类似于 yielding)理解和 return 而不是:

def my_enumerate(sequence, start=0):
    return [(start+i, sequence[i]) for i in range(len(sequence))]

您自己的枚举函数可能是这样的:

def my_enumerate(a_list):
    result = []
    counter = 0
    for item in a_list:
        result.append((counter, item))
        counter += 1
    return result

与内置的 enumerate 不同,后者是一次生成一个项目的生成器,您的函数返回一个列表。

也可以参考Pythons documentation,其中提出以下建议:

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1