我正在尝试通过python制作直方图。我将从以下代码段开始:
def histogram(L):
d = {}
for x in L:
if x in d:
d[x] += 1
else:
d[x] = 1
return d
我理解它使用字典功能来解决问题。
但我对第4行感到困惑:if x in d:
d是要构建的,d中还没有任何东西,那么如果x在d?
中怎么来答案 0 :(得分:5)
请注意,if
位于for
循环内。
因此,当您查看L
中的第一项时,d
中没有任何内容,但是当您到达L
中的下一项时,是{/ 1}}中的某些内容,因此您需要检查是否在直方图上创建新的bin(d
),或将该项添加到现有bin(d[x] = 1
)
在Python中,我们实际上有一些快捷方式:
d[x] += 1
这会自动启动from collections import defaultdict
def histogram(L):
d = defaultdict(int)
for x in L:
d[x] += 1
return d
中的每个bin为零(d
返回的内容),因此您无需检查bin是否存在。在Python 2.7或更高版本上:
int()
将自动映射from collections import Counter
d = Counter(L)
中每个项目的频率。无需其他代码。
答案 1 :(得分:2)
for
循环中的代码将针对L
中的每个元素执行一次,其中x
是当前元素的值。
让我们看一下L
是列表[3, 3]
的简单情况。第一次循环d
将为空,x
将为3,3 in d
将为false,因此d[3]
将设置为1.下次通过循环x
将再次为3,3 in d
将为真,因此d[3]
将增加1。
答案 2 :(得分:2)
您可以使用字典理解创建直方图:
histogram = {key: l.count(key) for key in set(L)}
答案 3 :(得分:1)
我认为其他人已经解释了为什么if x in d
。但这里有一个线索,如何在“不要求许可,请求宽恕”之后编写这段代码:
...
try:
d[x] += 1
except KeyError:
d[x] = 1
原因是,您希望此错误仅出现一次(每次方法调用至少一次)。因此,无需检查x in d
。
答案 4 :(得分:0)
如果x不在d中,那么它将被放入d中,d [x] = 1.基本上,如果x多次出现在d中,则会增加与x匹配的数字。
尝试使用它来逐步执行代码:http://people.csail.mit.edu/pgbovine/python/
答案 5 :(得分:0)
您可以使用例如matplotlib
在Python中创建自己的直方图。如果您想查看有关如何实施此示例的示例,请参阅this answer。
在这种特定情况下,您可以使用:
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')