Python使用';在';搜索不适合我的密钥

Python使用';在';搜索不适合我的密钥,python,dictionary,Python,Dictionary,我必须模拟一个超指数分布。我创建了这个函数来模拟它,并将结果存储在一个用作直方图的字典中。然后将直方图保存到CSV文件中,以便在电子表格(如Excel)中查看。它还返回直方图 import numpy as np def simulate_hyper_exponential_distribution(p=0.617066, lambda1=0.051, lambda2=0.052, iterations=10 ** 5): n = 0 # type: int histogra

我必须模拟一个超指数分布。我创建了这个函数来模拟它,并将结果存储在一个用作直方图的字典中。然后将直方图保存到CSV文件中,以便在电子表格(如Excel)中查看。它还返回直方图

import numpy as np

def simulate_hyper_exponential_distribution(p=0.617066, lambda1=0.051, lambda2=0.052, iterations=10 ** 5):
    n = 0  # type: int
    histogram = {}  # type: dict[float, int]

    for n in xrange(0, iterations):
        lambda_used = lambda1
        if np.random.uniform() >= p:
            lambda_used = lambda2

        random = float(round(np.random.exponential(1. / lambda_used), 1))
        if random not in histogram:
            histogram[random] = 1
        else:
            histogram[random] += 1

    if sum(histogram.values()) != iterations:
        print "Error!"
        return

    file = open('C:\\Users\\SteveB\\Desktop\\test_histogram.csv', 'w')

    max_histogram_key = max(histogram.keys()) + 0.1  # type: int

    # I think the error is in this for
    for current in np.arange(0, max_histogram_key, 0.1):
        if float(current) in histogram: # I think this is the line that fails
            file.write(str(current) + ',' + str(histogram[current]) + '\n')
        else:
            file.write(str(current) + ',0\n')

    file.close()
    print 'Finished!'
    return histogram
我用这行代码运行它:

histogram = simulate_hyper_exponential_distribution(0.617066, 0.051, 0.052)
我的问题是,生成的CVS文件在0中有某些值,我知道这些值没有0。最有趣的是,通过不同的执行,相同的值就是文件中错误的值(即0.3、0.6、0.7、1.2、1.4、1.7、1.9、2.3、2.4)。我键入
直方图[0.3]
(或前面列出的任何值),得到的值不同于0


现在,我将键值乘以10,并在字典中存储为int,之后,在文件中写入该值时,将其除以10,这种方法有效。我不知道使用浮点值时问题出在哪里。谢谢您的帮助。

我认为您无法可靠地比较浮点值是否相等。因为它们是设计近似值。也许中的
是错误的选择,因为它隐含着平等的确切定义。您可能需要编写一个函数,在比较浮点值时显式循环并允许较小的差异。这篇文章可能很有趣。你为什么不把你的列表放在字符串中,这样你就不用比较float,而是检查字符串列表中的字符串了?@PaulRooney谢谢。我想了想,我把钥匙打印出来,看看有没有0.29999,1.7111之类的。这件事没有发生,所以我认为情况并非如此。我会用另一种钥匙,谢谢@也许我会坚持使用int,我觉得它比字符串快。谢谢我认为不能可靠地比较浮点值是否相等。因为它们是设计近似值。也许
中的
是错误的选择,因为它隐含着平等的确切定义。您可能需要编写一个函数,在比较浮点值时显式循环并允许较小的差异。这篇文章可能很有趣。你为什么不把你的列表放在字符串中,这样你就不用比较float,而是检查字符串列表中的字符串了?@PaulRooney谢谢。我想了想,我把钥匙打印出来,看看有没有0.29999,1.7111之类的。这件事没有发生,所以我认为情况并非如此。我会用另一种钥匙,谢谢@也许我会坚持使用int,我觉得它比字符串快。谢谢