通过列表理解替换for循环

时间:2013-12-08 16:23:50

标签: python

嗨这里是python的新手...所以请原谅我,如果这是一个基本的问题

我想让我的代码很短,并注意到有简单的方法可以通过放置方括号的for内容来查看排序列表

e.g。

x = []
for i in range(10):
    x.append(i)
print x

相当于:

y[i for i in range(10)]
print y

所以我想以类似的方式缩短以下内容

import matplotlib as plt
import numpy as np
y = []
for i in xrange(499):
    y.append(np.random.binomial(500,.5))

plt.hist(y)

我尝试了这个但是没有用

z[np.random.binomial(500,.5) for i in xrange(499)]

5 个答案:

答案 0 :(得分:4)

此功能称为列表理解。请查看this documentation,了解它们的工作原理。

但是,在这种特殊情况下,您不需要列表理解,因为numpy.random.binomial需要size个参数。要生成包含499个样本的向量,可以执行以下操作:

z = np.random.binomial(500, 0.5, size=499)

答案 1 :(得分:3)

这应该有效:

z = [np.random.binomial(500,.5) for i in xrange(499)]

在这种情况下,numpy函数可以接受第三个参数大小,以便更快。

z = np.random.binomial(500, .5, 499)

答案 2 :(得分:2)

numpy.random.binomial需要大小/形状 - 使用:

z = np.random.binomial(500, 0.5, 499)

答案 3 :(得分:1)

=在哪里?

y = [i for i in range(10)]
# ^

z = [np.random.binomial(500,.5) for i in xrange(499)]
# ^

答案 4 :(得分:1)

numpy.fromiter可能是你最好的朋友。它允许您从可迭代对象创建新的1维数组。

基本上是:

>>> iterable = (x*x for x in range(5))
>>> np.fromiter(iterable, np.float)
array([  0.,   1.,   4.,   9.,  16.])

所以对你:

>>> iterable = np.asarray([np.random.binomial(500,.5) for x in xrange(499)])
>>> np.fromiter(iterable, np.float)
array([ 256.,  251.,  254.,  229.,  260.,  253.,  246.,  231.,  247.,
    255.,  245.,  229.,  269.,  257.,  248.,  244.,  224.,  238.,
    247.,  250.,  255.,  239.,  254.,  276.,  226.,  241.,  253.,
    247.,  264.,  264.,  244.,  254.,  259.,  246.,  253.,  254.,
    241.,  269.,  239.,  246.,  252.,  251.,  255.,  247.,  240.,
    248.,  264.,  237.,  239.,  249.,  252.,  234.,  239.,  260.,
    258.,  252.,  238.,  240.,  253.,  262.,  242.,  282.,  256.,
    247.,  241.,  243.,  252.,  241.,  265.,  232.,  261.,  253.,
    237.,  256.,  263.,  232.,  248.,  258.,  236.,  261.,  243.,
    250.,  245.,  262.,  250.,  255.,  255.,  230.,  238.,  245.,
    267.,  246.,  245.,  249.,  260.,  233.,  240.,  282.,  246.,
    245.,  245.,  249.,  256.,  256.,  245.,  260.,  241.,  245.,
    266.,  237.,  260.,  242.,  237.,  265.,  249.,  256.,  249.,
    276.,  264.,  246.,  256.,  244.,  253.,  229.,  249.,  242.,
    252.,  234.,  246.,  232.,  233.,  250.,  261.,  239.,  263.,
    269.,  254.,  254.,  246.,  255.,  241.,  269.,  259.,  230.,
    239.,  249.,  249.,  267.,  247.,  219.,  250.,  257.,  238.,
    260.,  254.,  253.,  244.,  240.,  245.,  244.,  257.,  225.,
    258.,  269.,  238.,  248.,  238.,  254.,  256.,  284.,  263.,
    238.,  254.,  249.,  261.,  243.,  244.,  250.,  236.,  240.,
    257.,  262.,  246.,  227.,  261.,  266.,  232.,  250.,  255.,
    261.,  253.,  241.,  252.,  242.,  244.,  246.,  244.,  237.,
    236.,  286.,  249.,  245.,  251.,  245.,  250.,  272.,  241.,
    238.,  247.,  263.,  258.,  266.,  240.,  253.,  266.,  255.,
    234.,  245.,  243.,  266.,  271.,  251.,  263.,  237.,  237.,
    253.,  250.,  230.,  245.,  254.,  242.,  245.,  265.,  247.,
    245.,  242.,  254.,  255.,  236.,  234.,  253.,  257.,  228.,
    246.,  236.,  261.,  244.,  240.,  259.,  239.,  254.,  239.,
    263.,  260.,  229.,  266.,  248.,  242.,  247.,  251.,  255.,
    255.,  251.,  248.,  254.,  258.,  236.,  248.,  248.,  247.,
    269.,  236.,  255.,  231.,  246.,  258.,  246.,  254.,  248.,
    250.,  265.,  232.,  259.,  248.,  241.,  246.,  239.,  241.,
    242.,  268.,  257.,  239.,  244.,  240.,  252.,  258.,  241.,
    256.,  256.,  240.,  246.,  253.,  257.,  258.,  232.,  243.,
    269.,  248.,  240.,  249.,  264.,  246.,  233.,  245.,  243.,
    241.,  240.,  241.,  228.,  281.,  252.,  254.,  266.,  236.,
    246.,  249.,  258.,  242.,  249.,  254.,  251.,  249.,  256.,
    236.,  247.,  234.,  252.,  250.,  246.,  249.,  246.,  220.,
    261.,  230.,  250.,  225.,  248.,  233.,  244.,  258.,  250.,
    251.,  259.,  243.,  249.,  264.,  250.,  244.,  255.,  254.,
    244.,  230.,  244.,  237.,  250.,  267.,  255.,  236.,  250.,
    226.,  257.,  239.,  253.,  259.,  231.,  256.,  251.,  266.,
    239.,  260.,  278.,  248.,  248.,  238.,  258.,  234.,  260.,
    264.,  261.,  255.,  266.,  259.,  236.,  270.,  244.,  233.,
    231.,  252.,  251.,  262.,  260.,  243.,  263.,  250.,  250.,
    247.,  261.,  251.,  229.,  250.,  237.,  250.,  252.,  262.,
    244.,  246.,  251.,  249.,  253.,  246.,  257.,  245.,  248.,
    255.,  268.,  255.,  253.,  212.,  241.,  260.,  259.,  243.,
    242.,  246.,  263.,  251.,  244.,  252.,  245.,  265.,  238.,
    270.,  253.,  254.,  242.,  246.,  265.,  240.,  255.,  255.,
    276.,  255.,  252.,  260.,  235.,  256.,  230.,  269.,  240.,
    249.,  254.,  234.,  250.,  251.,  243.,  248.,  250.,  240.,
    253.,  259.,  242.,  255.,  269.,  252.,  253.,  230.,  237.,
    255.,  247.,  263.,  231.,  241.,  258.,  241.,  252.,  251.,
    259.,  241.,  257.,  262.,  268.,  256.,  249.,  239.,  275.,
    242.,  262.,  258.,  244.])

虽然基本的列表理解是你的小数组的执行者,但如果你想使用更大尺寸的数组,这将会更加高效。