Python列表重新排序,还记得原始订单吗?

时间:2012-11-22 05:26:46

标签: python list python-3.x probability bayesian

我正在研究贝叶斯概率项目,我需要根据新信息调整概率。我还没有找到一种有效的方法来做到这一点。我要做的是从不同场景的等概率列表开始。防爆。 共有6个人:E,T,M,Q,L和Z,他们的初始相应概率被表示为

myList=[.1667, .1667, .1667, .1667, .1667, .1667]

新信息表面,第一个三分之一的人按字母顺序集体有70%的机会被选中。制作新列表,按名称(E,L,M,Q,T,Z)按字母顺序排序,仅包含新信息。 (.7 / .333 = 2.33,.3 / .667 = .45)

    newList=[2.33, 2.33, .45, .45, .45, .45)

我需要一种方法来命令newList与myList相同,这样我就可以在列表推导中乘以正确的值,并达到调整概率。具有单个一致的顺序是重要的,因为该过程将重复多次,每个具有不同的标准(元音,最接近P等),并且在具有大约1000个项目的列表中。 每个newList都可以改为newDictionary,然后一旦创建了调整条件,就可以将它们排序到列表中,但转换多个字典似乎效率低下。是吗?是否有一种简单的方法可以做到这一点我完全失踪了?

谢谢!

2 个答案:

答案 0 :(得分:1)

对于它的价值,你可以为Python中的方法速度做的最好的事情是使用numpy而不是标准类型(因此你将使用预编译的C代码来执行算术运算)。这将导致速度急剧增加。 Numpy数组无论如何都有固定的排序,语法更直接适用于数学运算。您只需要考虑如何将操作表示为矩阵运算。例如。你的例子:

myList = np.ones(6) / 6.
newInfo = np.array( [.7/2, .7/2, .3/4, .3/4, .3/4, .3/4] )
result = myList * newInfo

由于两个向量都有单位和,所以没有必要进行标准化(我不确定你在你的例子中做了什么,我承认,所以如果有一个微妙的我错过了让我知道),但如果你确实需要这是微不足道的:

result /= np.sum(result)

答案 1 :(得分:0)

尝试将您的信息存储为元组列表:

bayesList = [('E', 0.1667), ('M', 0.1667), ...]

你的列表理解可以按照

的方式进行
newBayes = [(person, prob * normalizeFactor) for person, prob in bayesList]

在设置列表推导之前计算了normalizeFactor