标签: generator-expression

生成器表达式调用返回列表的函数

我有一个返回列表的函数,我想使用紧凑的生成器表达式(或任何好的和紧凑的)在列表上调用时合并该函数的输出

假设我有一个 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]]
而我不想写另一行来推出列表中的列表.

python generator-expression

2
推荐指数
1
解决办法
59
查看次数

在python中没有重复代码的情况下,简单的方法将生成器更改为列表理解?

我有这样的事情:

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有一些叫做描述符的功能,它可以用来修改函数而不需要触及函数的主体,在这种情况下它是否合适?如果是的话,应该如何在这里使用?

python list-comprehension generator generator-expression

2
推荐指数
1
解决办法
621
查看次数

在Python中将yield语句转换为Generator表达式

我有一个关于将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

python yield generator generator-expression python-3.x

2
推荐指数
1
解决办法
268
查看次数

埃拉托色尼筛中的生成器递归跳过步骤

我在这里编写的筛选算法遇到了问题。我已经尝试修复它总共大约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

1
推荐指数
1
解决办法
191
查看次数

在论证中使用推导式

考虑一下:

>>> 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种说法,所以我不明白,第二个是如何第一个表达式的作品,但没有。

python syntax generator-expression python-3.x

1
推荐指数
1
解决办法
76
查看次数

生成器表达式包括条件测试而不调用函数两次?

假设我有一个执行一些繁重计算的函数.

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 generator-expression python-3.x

0
推荐指数
1
解决办法
204
查看次数

为什么这行不能在python中打印123 ... n?

最近我开始学习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
(注:仅连续输出)

python generator-expression python-3.x

0
推荐指数
1
解决办法
630
查看次数

如何检查第二个子列表中是否存在元素?

如果我有这样的列表:

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.

python for-loop nested generator-expression python-3.x

0
推荐指数
1
解决办法
176
查看次数