Python 在生成器中使用枚举

Python 在生成器中使用枚举,python,Python,我有一个任务: 在变量x中给定一个列表,编写一行Python生成器 表达式,该表达式仅返回x中的奇数整数元素 或者在x中有一个偶数(零基)索引。给定的列表可能包含 数字以外的项目。解决方案必须是生成器表达式 我写了这个有效的解决方案 def is_odd_integer(item): if type(item) is int: return item % 2 != 0 return False def is_even(index): return ind

我有一个任务:

在变量
x
中给定一个列表,编写一行Python生成器 表达式,该表达式仅返回x中的奇数整数元素 或者在
x
中有一个偶数(零基)索引。给定的列表可能包含 数字以外的项目。解决方案必须是生成器表达式

我写了这个有效的解决方案

def is_odd_integer(item):
    if type(item) is int:
        return item % 2 != 0
    return False

def is_even(index):
    return index % 2 == 0

def get_odd_integers_or_even_index(list):
    for index, item in enumerate(list):
        if is_odd_integer(item) or is_even(index):
           yield item


for item in get_odd_integers_or_even_index([1,2,5,6,'sdf', '12',5,4,3,4,4,4,4]):
    print(item)
在python生成器内部使用
enumerate
是否会违背其目的?如果是,您将如何实施

[v for i, v in enumerate(x) if ((type(v) is int and v % 2 == 1) or i % 2 == 0)]
编辑: 编辑解决方案以匹配编码

生成器表达式类似于编写“元组理解”,其格式如下:

generator = ( item for item in iterable if condition)
由于问题特别要求您编写一个一行生成器表达式,因此您可以使用上面的行。但是,在编写Pythonic代码时,我建议您将奇数的计算分离为lambda函数,例如:

is_odd = lambda x: x%2 == 1
results = (item for item in x if (isinstance(item, int) and is_odd(item))
                                  or not is_odd(x.index(item))
你可以用一个小盒子。由于您需要访问列表的索引,因此可以从
范围
表达式开始,使用它计算索引,或通过
[]
运算符访问列表的项:

(lst[i] for i in range(0, len(lst)) if (i % 2 == 0) or (isinstance(lst[i], int) and lst[i] % 2 == 1))

不过,这种语法是否比您的尝试更好,这是旁观者的看法。

是的,
枚举器可以在
生成器中使用。
以下是输入和输出示例:-

输入 枚举器和生成器 输出
我没有看到任何生成器表达式。请仔细阅读“生成器表达式”。另一个条件
I%2==0
@Andomar是否将其视为python生成器?我想不是。如果我错了,请纠正我。@sureshvv:在阅读时,上面是一个理解列表。您可以通过将
[]
替换为
()
将其转换为生成器。这不是一个生成表达式。我将使用“isinstance(v,int)”而不是“type(v)is int”
值%2==1
他想要奇数
(lst[i] for i in range(0, len(lst)) if (i % 2 == 0) or (isinstance(lst[i], int) and lst[i] % 2 == 1))
x = [1,2,5,6,'sdf', '12',5,4,3,4,4,11,4]
y = (value for index, value in enumerate(x) if type(value) is int and (value % 2 == 1 or index %2 == 0))
print (list(y))
[1, 2, 5, 6, 5, 4, 3, 4, 4, 4]