在生成器中使用枚举

时间:2017-08-13 08:08:46

标签: 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 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是否会破坏其目的?如果是,您将如何实现?

4 个答案:

答案 0 :(得分:1)

[v for i, v in enumerate(x) if ((type(v) is int and v % 2 == 1) or i % 2 == 0)]

编辑: 编辑解决方案以匹配编码 See it working at rextester.

答案 1 :(得分:0)

result = (item for item in x if (isinstance(item, int) and not item%2==0)
                                or x.index(item)%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))

答案 2 :(得分:0)

您可以使用generator expression。由于您需要访问列表的索引,因此您可以从range表达式开始并使用它来评估索引,或通过[]运算符访问列表的项目:

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

但是,这种语法是否比你的尝试更好,是在旁观者的眼中。

答案 3 :(得分:0)

是的,enumerator可以在generator里面使用这里是带输入和输出的示例: -

输入

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]