Python 建立直方图

Python 建立直方图,python,histogram,Python,Histogram,我正在尝试用python制作直方图。我从以下片段开始: def histogram(L): d = {} for x in L: if x in d: d[x] += 1 else: d[x] = 1 return d 我知道它是用字典功能来解决这个问题的。 但是我对第四行感到困惑:如果x在d中: d是要构造的,d中还没有任何东西,那么为什么x在d中呢?如果x不在d中,那么它被放入d中,d[

我正在尝试用python制作直方图。我从以下片段开始:

def histogram(L):
    d = {}
    for x in L:
        if x in d:
            d[x] += 1
        else:
            d[x] = 1
    return d
我知道它是用字典功能来解决这个问题的。 但是我对第四行感到困惑:
如果x在d中:


d是要构造的,d中还没有任何东西,那么为什么x在d中呢?

如果x不在d中,那么它被放入d中,d[x]=1。基本上,如果x多次出现在d中,它会增加与x匹配的数字


试着用这个单步执行代码:

如果x不在d中,那么它将被放入d中,d[x]=1。基本上,如果x多次出现在d中,它会增加与x匹配的数字


请尝试使用此选项逐步查看代码:

请记住,如果
for
循环中,则

因此,当您查看
L
中的第一个项目时,
d
中没有任何内容,但是当您进入
L
中的下一个项目时,
d
中有一些内容,因此您需要检查是否在直方图上创建一个新的仓位(
d[x]=1
),或者将该项目添加到现有仓位(
d[x]+=1

在Python中,我们实际上有一些快捷方式:

from collections import defaultdict

def histogram(L):
    d = defaultdict(int)
    for x in L:
        d[x] += 1
return d
这会自动将
d
中的每个箱子从零开始(
int()
返回的内容),因此您无需检查箱子是否存在。在Python 2.7或更高版本上:

from collections import Counter

d = Counter(L)

将自动映射
L
中每个项目的频率。不需要其他代码。

请记住,如果
for
循环中,则

因此,当您查看
L
中的第一个项目时,
d
中没有任何内容,但是当您进入
L
中的下一个项目时,
d
中有一些内容,因此您需要检查是否在直方图上创建一个新的仓位(
d[x]=1
),或者将该项目添加到现有仓位(
d[x]+=1

在Python中,我们实际上有一些快捷方式:

from collections import defaultdict

def histogram(L):
    d = defaultdict(int)
    for x in L:
        d[x] += 1
return d
这会自动将
d
中的每个箱子从零开始(
int()
返回的内容),因此您无需检查箱子是否存在。在Python 2.7或更高版本上:

from collections import Counter

d = Counter(L)

将自动映射
L
中每个项目的频率。不需要其他代码。

对于
L
中的每个元素,将对
x
中的
循环中的代码执行一次,其中
x
是当前元素的值


让我们来看一个简单的例子,其中
L
是列表
[3,3]
。第一次通过循环的
d
将为空,
x
将为3,d
中的
3将为假,因此
d[3]
将设置为1。通过循环的下一次
x
将再次为3,并且d
中的
3将为真,因此
d[3]
将增加1。

for
循环中的
代码将针对
L
中的每个元素执行一次,其中
x
是当前元素的值


让我们来看一个简单的例子,其中
L
是列表
[3,3]
。第一次通过循环的
d
将为空,
x
将为3,d
中的
3将为假,因此
d[3]
将设置为1。循环的下一次
x
将再次为3,d中的
3
将为真,因此
d[3]
将增加1。

我想其他人已经解释了为什么
如果d中的x
。但这里有一条线索,这段代码应该如何写在“不要请求许可,请求原谅”下面:


原因是,您希望此错误只出现一次(每个方法调用至少出现一次)。因此,没有必要检查d中的x是否
。但这里有一条线索,这段代码应该如何写在“不要请求许可,请求原谅”下面:


原因是,您希望此错误只出现一次(每个方法调用至少出现一次)。因此,无需检查是否可以使用例如
matplotlib
在Python中创建自己的直方图。如果您想了解如何实现这一点的示例,可以参考

在此特定情况下,您可以使用doing:

temperature = [4,   3,   1,   4,   6,   7,   8,   3,   1]
radius      = [0,   2,   3,   4,   0,   1,   2,  10,   7]
density     = [1,  10,   2,  24,   7,  10,  21, 102, 203]

points, sub = hist3d_bubble(temperature, density, radius, bins=4)
sub.axes.set_xlabel('temperature')
sub.axes.set_ylabel('density')
sub.axes.set_zlabel('radius')

您可以使用Python创建自己的直方图,例如
matplotlib
。如果您想了解如何实现这一点的示例,可以参考

在此特定情况下,您可以使用doing:

temperature = [4,   3,   1,   4,   6,   7,   8,   3,   1]
radius      = [0,   2,   3,   4,   0,   1,   2,  10,   7]
density     = [1,  10,   2,  24,   7,  10,  21, 102, 203]

points, sub = hist3d_bubble(temperature, density, radius, bins=4)
sub.axes.set_xlabel('temperature')
sub.axes.set_ylabel('density')
sub.axes.set_zlabel('radius')

您可以创建具有dict理解的直方图:

histogram = {key: l.count(key) for key in set(L)}

您可以创建具有dict理解的直方图:

histogram = {key: l.count(key) for key in set(L)}
可以使用Python 2.7和Python 3.1+中提供的

>>> # init empty counter
>>> from collections import Counter
>>> c = Counter()

>>> # add a single sample to the histogram
>>> c.update([4])
>>> # add several samples at once
>>> c.update([4, 2, 2, 5])

>>> # print content
>>> print c

Counter({2: 2, 4: 2, 5: 1})
该模块提供了几个不错的功能,比如计数器上的加法、减法、求交和并集。
计数器
可以计算可用作字典键的任何内容。

可以使用Python 2.7和Python 3.1+提供的

>>> # init empty counter
>>> from collections import Counter
>>> c = Counter()

>>> # add a single sample to the histogram
>>> c.update([4])
>>> # add several samples at once
>>> c.update([4, 2, 2, 5])

>>> # print content
>>> print c

Counter({2: 2, 4: 2, 5: 1})

该模块提供了几个不错的功能,比如计数器上的加法、减法、求交和并集。
计数器
可以计算任何可用作字典键的东西。

除了
之外,它比
if
慢得多,但是
try
更快——因此,如果
如果x不在d中
发生得相当频繁,最好征得许可。当
键错误
确实是例外情况时,那么你应该使用
尝试
/
例外
并请求原谅。
例外
如果
慢得多,但是
尝试
更快——因此如果
如果x不在d中
会相当频繁地发生,最好请求允许。当
键错误
确实是例外情况时,您应该使用
尝试
/
例外
并请求原谅。如果您查找直方图,则使用直方图函数f