我正在尝试建立一个计数直方图...所以我创建了桶。 我知道我可以通过并附加一堆零,即这些内容:
buckets = []
for i in xrange(0,100):
buckets.append(0)
有更优雅的方式吗?我觉得应该有一种方法来声明一个特定大小的数组。
我知道numpy有numpy.zeros
,但我想要更通用的解决方案
答案 0 :(得分:316)
buckets = [0] * 100
小心 - this technique doesn't generalize to multidimensional arrays or lists of lists。这会导致List of lists changes reflected across sublists unexpectedly问题
答案 1 :(得分:86)
为了完整性:要在python中声明一个零的多维列表,你必须使用这样的列表推导:
buckets = [[0 for col in range(5)] for row in range(10)]
以避免行之间的参考共享。
这看起来比chester1000的代码更笨拙,但如果以后要更改这些值则必不可少。有关详细信息,请参阅Python FAQ。
答案 2 :(得分:17)
您可以将list
乘以整数n
,以重复list
n
次:
buckets = [0] * 100
答案 3 :(得分:17)
使用此:
bucket = [None] * 100
for i in range(100):
bucket[i] = [None] * 100
OR
w, h = 100, 100
bucket = [[None] * w for i in range(h)]
它们都将输出正确的空多维桶列表100x100
答案 4 :(得分:12)
答案 5 :(得分:3)
最简单的解决方案是
"\x00" * size # for a buffer of binary zeros
[0] * size # for a list of integer zeros
一般情况下,您应该使用更多pythonic代码,例如列表推导(在您的示例中为[0 for unused in xrange(100)]
)或使用string.join
作为缓冲区。
答案 6 :(得分:2)
问题是“如何声明零数组...... ”,但示例代码引用了Python列表:
buckets = [] # this is a list
但是,如果有人真的想要初始化数组,我建议:
from array import array
my_arr = array('I', [0] * count)
Python纯粹主义者可能声称这不是 pythonic 并建议:
my_arr = array('I', (0 for i in range(count)))
pythonic 版本非常慢,当您使用数千个值初始化几百个数组时,差异非常明显。
答案 7 :(得分:0)
根据收集后数据的实际情况,collections.defaultdict(int)可能会有用。
答案 8 :(得分:-1)
我想通过发布示例程序及其输出
来帮助您计划: -
t=input("")
x=[None]*t
y=[[None]*t]*t
for i in range(1,t+1):
x[i-1]=i;
for j in range(1,t+1):
y[i-1][j-1]=j;
print x
print y
输出: -
2
[1, 2]
[[1, 2], [1, 2]]
我希望这能清除你的一些非常基本的概念。要使用其他一些特定值初始化它们,例如使用0..inou初始化它们,可以将它们声明为:
X = [0] * 10
希望它有所帮助.. !! ;)
答案 9 :(得分:-2)
如果您需要更多列:
buckets = [[0., 0., 0., 0., 0.] for x in range(0)]