我有一个任务:
给定变量
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
是否会破坏其目的?如果是,您将如何实现?
答案 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]