这是一个看似简单的问题:给定一个按升序生成整数序列的迭代器列表,编写一个简洁的生成器,只生成每个序列中出现的整数.
在昨晚阅读了几篇论文之后,我决定在Python中破解一个完全最小的全文索引器,如此处所示(尽管该版本现在已经很老了).
我的问题在于search()函数,它必须迭代每个发布列表并仅产生每个列表上显示的文档ID.正如您从上面的链接中看到的那样,我当前的非递归"工作"尝试非常糟糕.
示例:
postings = [[1, 100, 142, 322, 12312],
[2, 100, 101, 322, 1221],
[100, 142, 322, 956, 1222]]
Run Code Online (Sandbox Code Playgroud)
应该产量:
[100, 322]
Run Code Online (Sandbox Code Playgroud)
至少有一个优雅的递归函数解决方案,但我想尽可能避免这种情况.但是,一个涉及嵌套生成器表达式,itertools滥用或任何其他类型的代码高尔夫的解决方案非常受欢迎.:-)
应该可以安排函数只需要与最小列表中的项目一样多的步骤,并且不将整个整数集吸入内存.将来,这些列表可能从磁盘读取,并且大于可用RAM.
在过去的30分钟里,我对我的舌尖有了一个想法,但我无法将其纳入代码中.请记住,这只是为了好玩!
我有一个Python生成器,可以调用自己来获得更多元素.它看起来像这样:
def gen(list):
# ...
if list:
for x in gen(list[1:]):
yield x
Run Code Online (Sandbox Code Playgroud)
我的问题是关于最后两行:是否有更简洁的方式来表达这一点?我希望有这样的东西(理解这不是有效的Python原样):
def gen(list):
# ...
if list:
yield each in gen(list[1:])
Run Code Online (Sandbox Code Playgroud) 在我说一句话之前,让我感谢社区作为我最近编程查询的权威位置.并假装那些称赞不是用文字表达的.无论如何,概率定律指出我偶然发现了使用多功能搜索栏找不到的东西,所以我决定第一次明确要求.也许我只是没有使用Pythonic-enough语言进行搜索.或许我在Googling/Stackoverflowing吮吸.而不管...
我正在玩Python协同程序和生成器.从我可以收集到的,你可以做任何生成器理解可以与生产者协同程序,尽管更冗长.我目前正在使用Python 3,尽管有关Python 2的任何答案都不会错过.
所以我假设以下代码片段是等价的:
one_to_three = (num for num in range(1, 4))
Run Code Online (Sandbox Code Playgroud)
...
def one_to_three():
for num in range(1, 4):
yield num
one_to_three_gen = one_to_three()
Run Code Online (Sandbox Code Playgroud)
它适用于我的Python安装.如果我忽略该代码中的冗余 - 如此常见的示例,我看到生成器理解很容易映射到生成器协同程序生成的生成器.作为Pragmatic博士,我尝试将相同的概念映射到dicts,因为dict理解已经存在,我认为这两个是等价的:
one_to_three_doubles = {num : num * 2 for num in range(1, 4)}
Run Code Online (Sandbox Code Playgroud)
...
def one_to_three_doubles():
for num in range(1, 4):
yield num : num * 2
one_to_three_doubles_gen = one_to_three_doubles()
Run Code Online (Sandbox Code Playgroud)
第一个可以工作,但第二个没有.它标记第3行冒号上的语法错误.
现在,要么我在语法上略微下滑,要么我对生产者协程如何工作有很大的误解.我怀疑它的失败是因为你不能让coroutine返回列表而不是生成器,但我真的不知道.
所以是的,修正这个错误基本上就是我所要求的; 提前致谢.我更喜欢一个答案,告诉我答案,而不是给我一个全新的方法来实现结果,但显然如果这是唯一的方法......
当我在for循环中使用生成器时,它似乎"知道",当没有更多元素产生时.现在,我必须使用没有for循环的生成器,并手动使用next()来获取下一个元素.我的问题是,我怎么知道,如果没有更多的元素?
我只知道:next()引发一个异常(StopIteration),如果没有剩下的东西,那么对于这样一个简单的问题来说,这不是一个例外吗?是不是像has_next()那样的方法?
以下几行应该说清楚,我的意思是:
#!/usr/bin/python3
# define a list of some objects
bar = ['abc', 123, None, True, 456.789]
# our primitive generator
def foo(bar):
for b in bar:
yield b
# iterate, using the generator above
print('--- TEST A (for loop) ---')
for baz in foo(bar):
print(baz)
print()
# assign a new iterator to a variable
foobar = foo(bar)
print('--- TEST B (try-except) ---')
while True:
try:
print(foobar.__next__())
except StopIteration:
break
print()
# assign …Run Code Online (Sandbox Code Playgroud) 通常,当您想在Python中迭代列表的一部分时,最简单的方法就是对列表进行切片.
# Iterate over everything except the first item in a list
#
items = [1,2,3,4]
iterrange = (x for x in items[1:])
Run Code Online (Sandbox Code Playgroud)
但切片运算符会创建一个新列表,在许多情况下甚至不需要这样做.理想情况下,我想要一种创建生成器的切片函数,而不是新的列表对象.可以通过创建一个生成器表达式来实现与此类似的东西,该表达式使用a range来仅返回列表的某些部分:
# Create a generator expression that returns everything except
# the first item in the list
#
iterrange = (x for x, idx in zip(items, range(0, len(items))) if idx != 0)
Run Code Online (Sandbox Code Playgroud)
但这有点麻烦.我想知道是否有更好,更优雅的方式来做到这一点.那么,切片列表的最简单方法是什么,以便创建生成器表达式而不是新的列表对象?
我知道通过使用Xeger,我们可以获得指定模式的随机值.
String regex = "[0-9]{2}";
Xeger generator = new Xeger(regex);
String result = generator.generate();
Run Code Online (Sandbox Code Playgroud)
我想知道有没有办法返回指定正则表达式的所有有效字符串.例如,对于模式:[0-9]{2},我们可以得到所有的值00来99.
谢谢
编辑:
在这里,我们不考虑像+和*这样的无限输出; 我们如何获得有限正则表达式的所有值?
最后编辑:
感谢大家!最后,我没有考虑所有可能的值,因为可能有数千个.我将特定数量限制为减少数量的值的数量.
Node.js现在有了生成器.
我的理解是,生成器可用于编写看起来更加线性的代码,并避免回调地狱和厄运风格编码的金字塔.
所以到目前为止,我的理解是在生成器内部,代码执行直到达到"yield"语句.此时暂停执行生成器功能.该yield语句指定一个返回值,该值可以是一个函数.通常,这将是一个阻塞I/O函数 - 通常需要异步执行的函数.
yield的返回函数返回到任何称为生成器的函数.
我的问题是,此时会发生什么?究竟是什么执行了yield返回的阻塞I/O函数?
编写看似线性的生成器/良品代码是正确的,需要有一种特定类型的函数来调用生成器,这是一个循环生成器并执行yield返回的每个异步函数的函数并返回异步功能返回发电机的结果?
我仍然不清楚如何执行yield返回的asynch函数.如果它由调用生成器的函数执行,它是否异步执行?我猜是因为否则会导致阻塞行为.
总结一下我的问题:
任何人都可以提供更好的概述/总结整个过程的工作原理吗?
我是python中的新生成器.我有一个简单的代码,我正在玩,但我无法理解我从中得到的输出.这是我的代码:
def do_gen():
for i in range(3):
yield i
def incr_gen(y):
return y + 1
def print_gen(x):
for i in x:
print i
x = do_gen()
y = (incr_gen(i) for i in x)
print_gen(x)
print_gen(y)
Run Code Online (Sandbox Code Playgroud)
我希望我的输出是这样的:
0 1 2
1 2 3
Run Code Online (Sandbox Code Playgroud)
但我只看到:0 1 2
我不明白这个输出.谁能帮助我理解我缺乏理解?提前致谢.
我是朱莉娅的新手.我主要在python中编程.
在python中,如果要迭代一大组值,通常会构造一个所谓的生成器来节省内存使用量.这是一个示例代码:
def generator(N):
for i in range(N):
yield i
Run Code Online (Sandbox Code Playgroud)
我想知道朱莉娅是否有类似的东西.阅读julia手册后,@ task macro似乎与python中的生成器具有相同(或类似)的功能.然而,经过一些实验,在julia中,内存使用量似乎比通常的数组大.
我@time在IJulia中使用来查看内存使用情况.这是我的示例代码:
[更新]:添加generator方法代码
(generator方法)
function generator(N::Int)
for i in 1:N
produce(i)
end
end
Run Code Online (Sandbox Code Playgroud)
(发电机版)
function fun_gener()
sum = 0
g = @task generator(100000)
for i in g
sum += i
end
sum
end
Run Code Online (Sandbox Code Playgroud)
@time fun_gener()
已用时间:0.420731828秒(已分配6507600字节)
(阵列版)
function fun_arry()
sum = 0
c = [1:100000]
for i in c
sum += i
end
sum
end
Run Code Online (Sandbox Code Playgroud)
@time fun_arry()
已用时间:0.000629629秒(已分配800144个字节)
谁能告诉我为什么@task在这种情况下需要更多空间?如果我想将内存使用量保存为处理大量值,我该怎么办?
我试图在打字稿中使用生成器函数.但编译器会抛出错误
error TS2339: Property 'next' does not exist on type
下面是我最接近的代码示例.
export default class GeneratorClass {
constructor() {
this.generator(10);
this.generator.next();
}
*generator(count:number): Iterable<number | undefined> {
while(true)
yield count++;
}
}
Run Code Online (Sandbox Code Playgroud)
generator ×10
python ×5
yield ×3
python-3.x ×2
code-golf ×1
dictionary ×1
ecmascript-6 ×1
iteration ×1
iterator ×1
java ×1
javascript ×1
join ×1
julia ×1
next ×1
node.js ×1
recursion ×1
regex ×1
slice ×1
typescript ×1