【问题标题】:Python list reordering, remember original order?Python 列表重新排序,还记得原来的顺序吗?
【发布时间】:2012-11-22 05:26:46
【问题描述】:

我正在做一个贝叶斯概率项目,我需要根据新信息调整概率。我还没有找到一种有效的方法来做到这一点。我要做的是从不同场景的等概率列表开始。前任。 共有 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,然后一旦创建了调整条件,就可以将它们排序到一个列表中,但是转换多个字典似乎效率低下。是吗?有没有一种我完全想念的简单方法?

谢谢!

【问题讨论】:

  • 这似乎是过早优化的经典案例:您的代码将花费大部分时间(到目前为止)进行贝叶斯计算,因此您无需担心您描述的那种低效率;没关系。
  • 注明。我仍然是一个相对初学者,所以我不确定效率,似乎字典到有序列表的转换可能很慢。知道这不是什么大不了的事让人放心。

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


【解决方案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)

【讨论】:

    【解决方案2】:

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

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

    你的列表理解可以是

    newBayes = [(person, prob * normalizeFactor) for person, prob in bayesList]
    

    在设置列表理解之前计算您的 normalizeFactor 位置

    【讨论】:

    • 那么我将如何指定 normalizeFactor 以确保它是正确的?另一个元组列表?就此而言,如果我使用两个元组列表,使用两组元组会比列表更有效吗?
    • @user1816773:在优化工作之前,您再次担心优化。先这样做,看看它有多快,然后在必要时加快速度。
    • normalizeFactor = sum([prob for person, prob in bayesList]) 或者您可以在考虑新信息时计算/跟踪它
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多