我正在做一些统计工作,我有一个(大)随机数集合来计算平均值,我想使用生成器,因为我只需要计算均值,所以我不需要存储数字.
问题是numpy.mean如果你把它传给发电机就会中断.我可以写一个简单的函数来做我想要的,但我想知道是否有一个正确的,内置的方法来做到这一点?
如果我能说"sum(values)/ len(values)"会很好,但是len不适用于genetators,并且总和已经消耗的值.
这是一个例子:
import numpy
def my_mean(values):
n = 0
Sum = 0.0
try:
while True:
Sum += next(values)
n += 1
except StopIteration: pass
return float(Sum)/n
X = [k for k in range(1,7)]
Y = (k for k in range(1,7))
print numpy.mean(X)
print my_mean(Y)
Run Code Online (Sandbox Code Playgroud)
这两个都给出相同,正确,答案,买my_mean不适用于列表,numpy.mean不适用于生成器.
我真的很喜欢使用发电机的想法,但这样的细节似乎破坏了事情.
我有两台发电机g1和g2
for line in g1:
print line[0]
Run Code Online (Sandbox Code Playgroud)
[a,a,a]
[b,b,b]
[c,c,c]
for line1 in g2:
print line1[0]
Run Code Online (Sandbox Code Playgroud)
[1,1,1]
[2,2,2]
[3,3,3]
for line in itertools.chain(g1, g2):
print line[0]
Run Code Online (Sandbox Code Playgroud)
并[a,A,A]
[B,B,B]
[C,C,C]
[1,1,1]
[2,2,2]
[3,3,3]
怎么样
得到如下输出:
[a,a,a],[1,1,1]
[b,b,b],[2,2,2]
[c,c,c],[3,3, 3]
或
并[a,A,A,1,1,1]
[B,B,B,2,2,2]
[C,C,C,3,3,3]
谢谢您的帮助.
以下是将可迭代项目拆分为子列表的两个函数.我相信这种类型的任务是多次编程的.我使用它们来解析由repr('result','case',123,4.56)和('dump',..)等行组成的日志文件.
我想改变这些,以便它们将产生迭代器而不是列表.因为列表可能会变得非常大,但我可以根据前几个项目决定接受或跳过它.此外,如果iter版本可用,我想嵌套它们,但这些列表版本会通过复制部分浪费一些内存.
但是从可迭代源中获取多个生成器对我来说并不容易,所以我请求帮助.如果可能的话,我希望避免引入新课程.
另外,如果您对这个问题有更好的标题,请告诉我.
谢谢!
def cleave_by_mark (stream, key_fn, end_with_mark=False):
'''[f f t][t][f f] (true) [f f][t][t f f](false)'''
buf = []
for item in stream:
if key_fn(item):
if end_with_mark: buf.append(item)
if buf: yield buf
buf = []
if end_with_mark: continue
buf.append(item)
if buf: yield buf
def cleave_by_change (stream, key_fn):
'''[1 1 1][2 2][3][2 2 2 2]'''
prev = None
buf = []
for item in stream:
iden = key_fn(item)
if prev is None: prev = iden
if …Run Code Online (Sandbox Code Playgroud) 我的理解是使用Generator是实现这类目标的最佳方式,但我愿意接受建议.
具体来说,一个用例是这样的:我想打印一些项目和另一个列表,任意长度,必要时截断初始迭代器.
这是工作的python代码,演示了我想要的确切示例行为:
def loop_list(iterable):
"""
Return a Generator that will infinitely repeat the given iterable.
>>> l = loop_list(['sam', 'max'])
>>> for i in range(1, 11):
... print i, l.next()
...
1 sam
2 max
3 sam
4 max
5 sam
6 max
7 sam
8 max
9 sam
10 max
>>> l = loop_list(['sam', 'max'])
>>> for i in range(1, 2):
... print i, l.next()
...
1 sam
"""
iterable = tuple(iterable)
l = len(iterable)
num = 0 …Run Code Online (Sandbox Code Playgroud) 关于python和.join()方法的一个基本问题:
file1 = open(f1,"r")
file2 = open(f2,"r")
file3 = open("results","w")
diff = difflib.Differ()
result = diff.compare(file1.read(),file2.read())
file3.write("".join(result)),
Run Code Online (Sandbox Code Playgroud)
上面的代码片段以字符串格式生成一个存储在名为"results"的文件中的良好输出,逐行显示两个文件之间的差异.但是我注意到,如果我只是在不使用.join()的情况下打印"result" ,编译器将返回包含内存地址的消息.在尝试将结果写入文件而不使用.join()之后,编译器通知我,在.join()方法中只能使用字符串和字符缓冲区,而不是生成器对象.因此,根据我提出的所有证据,如果我错了,请纠正我:
result = diff.compare(file1.read(),file2.read()) <----结果是生成器对象?
result是一个字符串列表,它result本身是第一个字符串的引用?
.join() 获取一个内存地址并指向第一个,然后迭代该结构中字符串的其余地址?
生成器对象是一个返回指针的对象?
如果我的问题不清楚,我道歉,但我基本上想问问python退伍军人,如果我的扣除是正确的.我的问题不是关于可观察的结果,而是更多关于python的内部工作原理.我感谢你的所有帮助.
为什么以下Python代码会引发错误
TypeError: type object argument after * must be a sequence, not generator
,如果我在生成器f中注释第一行(无用),一切正常?
from itertools import izip
def z():
for _ in range(10):
yield _
def f(z):
for _ in z: pass # if I comment this line it works! (??)
for x in range(10):
yield (x,10*x,100*x,1000*x)
iterators = izip(*f(z))
for it in iterators:
print list(it)
Run Code Online (Sandbox Code Playgroud)
注意我实际上要做的是,使用单个生成器,返回多个迭代器(尽可能多的我将作为参数传递给生成器).我发现这样做的唯一方法是产生元组并对它们使用izip() - 对我来说是黑魔法.
Q1 - 以下是set()a generator expression还是a set comprehension?(或者它们是否相同?如果是这样,那么list&dictcomprehensions是否也在发电机上进行相应的类型转换?)
my_set = {x for x in range(10)}
Run Code Online (Sandbox Code Playgroud)
Q2 - 评估是否考虑重复值,然后通过应用删除它们set()?
dup_set = {x for x in [0, 1, 2, 0, 1, 2]}
Run Code Online (Sandbox Code Playgroud)
理解是否比常规for循环更好地执行(速度方面)?
更新 - 我尝试timeit用于速度比较.我不确定我是否只是(公平).
C:\>python -m timeit "s = set()" "for x in range(10):" "
s.add(x)"
100000 loops, best of 3: 2.3 usec per loop
C:\>python -m timeit "s = {x for x …Run Code Online (Sandbox Code Playgroud) 根据文档的评论:http://php.net/manual/en/language.generators.overview.php
我们可以看到,由于生成器有大量的内存使用改进(这是显而易见的),但也有2-执行速度慢3倍 - 这对我来说并不那么明显.
我们以牺牲时间为代价来提高内存使用率 - 这并不好.
那么,为什么php生成器比foreach慢?
谢谢你的提示.
我有一个功能,返回一个发电机.目前它使用yield from:
function foo()
{
$generator = getGenerator();
// some other stuff (no yields!)
yield from $generator;
}
Run Code Online (Sandbox Code Playgroud)
如果我yield from用一个简单的替换它,return在这种情况下,这会改变什么吗?也许在执行中?还是表现?会yield from产生一个新的"外部"迭代器吗?
我知道,在其他情况下yield from可以更灵活,因为我可以使用它几次甚至将它与简单的yields 混合,但这对我的情况无关紧要.
该类collections.defaultdict采用默认工厂,用于生成默认值。
如果包含在dict-like 对象中的值应默认为False,则可以将实例创建为:
d_false = defaultdict(bool)
Run Code Online (Sandbox Code Playgroud)
为默认值实现相同的最pythonic 的方法是True什么?
换句话说,是否有一个标准的可调用对象返回True,它习惯上用作bool?
当然,工厂可以构建为 lambda 表达式:
d_true = defaultdict(lambda: True)
Run Code Online (Sandbox Code Playgroud)
但这可能是在重新发明轮子。