我有一个返回列表的函数,我想使用紧凑的生成器表达式(或任何好的和紧凑的)在列表上调用时合并该函数的输出
假设我有一个 def foo(bar):
where bar是整数,它在一些疯狂的复杂计算后返回一个列表.
foo(1)=[9,1,5]
foo(2)=[1]
foo(3)=[7,1]
arr=[1,2,3]
Run Code Online (Sandbox Code Playgroud)
如何arr=[9,1,5,1,7,1]
在一行代码后获得希望?
arr=[foo(x) for x in arr]
给了我[[9,1,5],[1],[7,1]]
而我不想写另一行来推出列表中的列表.
我有这样的事情:
class TransMach:
def __init__(self, machfile, snpfile):
self.machfile = machfile
self.snpfile = snpfile
def __translines(self):
fobj = open(self.machfile)
lines = (l.strip().split()[2] for l in fobj)
tlines = zip(*lines)
return tlines
Run Code Online (Sandbox Code Playgroud)
使用生成器是为了避免将整个文件读入内存,但有时读取整个文件正是所需的(即列表理解).如果没有太多额外的代码,我怎么能改变这种行为呢?目标是能够在这两种模式之间进行选择.我听说python有一些叫做描述符的功能,它可以用来修改函数而不需要触及函数的主体,在这种情况下它是否合适?如果是的话,应该如何在这里使用?
我有一个关于将yield语句转换为生成器表达式的问题
所以我有这个小的yield方法,它获取一个函数和一个起始数作为它的输入,并且基本上为每个被调用的数字调用函数,即:
这是Python中的代码:
def some_func(function, number):
while True:
yield number
number = function(number)
Run Code Online (Sandbox Code Playgroud)
将此代码段转换为生成器表达式的方法有哪些?我猜这种做法有一种非常pythonic和优雅的方式,但我无法理解它.
我对Generator Expressions非常不熟悉,因此为什么我要求帮助,但我确实希望扩展我对Gen Exp的了解,尤其是Python
我在这里编写的筛选算法遇到了问题。我已经尝试修复它总共大约10个小时了。我在这里四处寻找类似的问题,但似乎找不到任何遇到此问题的人。我对 python 比较陌生,在阅读了大量生成器文档后,我设法编写了有效的代码。然而,我仍然不知道为什么我的第一次尝试失败了。
我所想到的是,在每个连续的筛分步骤中,似乎 gen1 实际上并没有被清空。因此,我尝试交替使用名称 gen1 和 gen2,并删除每个名称以避免此问题。那也没用。
我真的很感激对此的一些见解,以及任何改进我现在所拥有的建议。
这是失败的代码:
def primes(n):
"yields primes up to n. For use with large n"
q = 0
yield 2
gen1 = (x for x in range(3,n,2))
while q*q < n:
q = next(gen1)
gen1 = (x for x in gen1 if x%q != 0)
yield q
else:
while 1:
try:
yield next(gen1)
except:
StopIteration
break
Run Code Online (Sandbox Code Playgroud)
这是我当前的代码:
import math
global gen1
global gen
def gen1(x):
for i in range(3,x,2):
yield i
def …
Run Code Online (Sandbox Code Playgroud) python recursion generator generator-expression sieve-of-eratosthenes
考虑一下:
>>> set((x,y) for x in range(1,3) for y in range(1,3))
{(1, 1), (1, 2), (2, 1), (2, 2)}
Run Code Online (Sandbox Code Playgroud)
但是,如果我只采用上面使用的参数:
>>> (x,y) for x in range(1,3) for y in range(1,3)
Run Code Online (Sandbox Code Playgroud)
我得到 SyntaxError
set
在我的第一次通话中到底得到了什么?一个东西?一种表达?它们是不同的东西吗?
从技术上讲,set
预计最多1种说法,所以我不明白,第二个是如何第一个表达式的作品,但没有。
假设我有一个执行一些繁重计算的函数.
def f(x):
...
return result
Run Code Online (Sandbox Code Playgroud)
然后我有一个列表,其中包含我想要传递给的值f()
:
my_list = [2, 98, 4, 34, 23, 11]
Run Code Online (Sandbox Code Playgroud)
我想x
在这个列表中找到第一个验证条件的元素f(x)
(比如说f(x) != 0
),得到这个计算结果.
基本上,我会写一个for
这样的循环:
def first_match(my_list):
for x in my_list:
r = f(x)
if r != 0:
return r
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法使用生成器表达式获得相同的结果?
我到目前为止的想法是这样的:
r = next(f(x) if f(x) != 0 for x in my_list)
Run Code Online (Sandbox Code Playgroud)
问题是这个叫f()
两次.
最近我开始学习python编程语言,我在使用这个打印123..n序列时遇到困难:
n=10
print(i for i in range(1,n+1))
Run Code Online (Sandbox Code Playgroud)
我得到了这个输出:
<generator object <genexpr> at 0x7f5990f20db0>
Run Code Online (Sandbox Code Playgroud)
期待输出:
1234 .... n
(注:仅连续输出)
如果我有这样的列表:
L = [
['a', 'b'],
['c', 'f'],
['d', 'e']
]
Run Code Online (Sandbox Code Playgroud)
我知道我可以'f'
通过any
以下方式检查是否包含在任何子列表中:
if any('f' in sublist for sublist in L) # True
Run Code Online (Sandbox Code Playgroud)
但是,我将如何搜索第二个子列表,即列表是否按以下方式初始化:
L = [
[
['a', 'b'],
['c', 'f'],
['d', 'e']
],
[
['z', 'i', 'l'],
['k']
]
]
Run Code Online (Sandbox Code Playgroud)
我尝试将for in
这样的表达式链接起来:
if any('f' in second_sublist for second_sublist in sublist for sublist in L)
Run Code Online (Sandbox Code Playgroud)
但是,这会崩溃,因为name 'sublist' is not defined
.