当前位置: 首页 > 知识库问答 >
问题:

如何将列表的后期元素与早期元素组合,同时保持列表在这些后期元素之前的顺序?

蓬意致
2023-03-14

长话短说,我在掷不公平的骰子,并试图在x个骰子数之后找到任何给定和的概率。实际上有数百张脸和数百个卷轴,所以我不能简单地找到所有可能的组合,然后找到概率,列出大小和内存限制。

我通过寻找所有可能的组合以及它们一次发生一次滚动的概率来解决这个问题。在我找到所有可能的组合和每个组合的概率后,我需要通过将组合的概率与相同的总和相结合来压缩它。

想想组合(1,3)和(2,2)都是唯一的组合,但是它们都有4的总和,如果(1,3)发生的概率是3/6,(2,2)发生的概率是1/6,组合的概率是4/6。

希望我不需要详细说明为什么会这样以及背后的数学原理,但是如果需要更多信息,请告诉我。

我已经知道了,我有一个列表,包含滚动后每个可能组合的总和,还有一个全等列表,包含这些总和的概率。

我们的例子是这样的:

Sum of this rolls combos:
Sums = [6,4,2,5,4,3]
The congruent list of probabilities:
Probs = [11/36, 9/36, 7/36, 5/36, 3/36, 1/36] 

在我们的真实示例中,数字没有也不可能有公分母,并且是长小数,但我使用这些数字来显示我正在寻找的东西。

秩序很重要。我可以使用以下方法从总和列表中删除重复总和,并保持所需的顺序:

Condenced_sums = []
For x in sums:
    If x not in condenced_sums
        condenced_sums.append(x)  

这给了我们压缩的_和=[6,4,2,5,3]

我的问题是相应的概率不会消失,第一次出现的概率和任何重复出现的概率都不一样。为了确保每个和的概率保持准确,在我删除重复出现的概率之前,我需要将其添加到原始出现的概率中。理想情况下,浓缩的问题如下所示:

Condenced_prob = [11/36, 12/36, 7/36, 5/36, 1/36]

我在想也许我可以把列表压缩在一起,得到这样的东西:

Zipped_Sum_Prob = [(6, 11/36), (4, 9/36), (2, 7/36), (5, 5/36), (4, 3/36), (3, 1/36)]

然后可能在列表理解语句中使用If-else语句,但我对这一点还是很陌生,还没有想到一种方法来实现这一点。

作为另一个注意事项,因为我不确定这是否会产生影响,任何总和可能会出现几次,而不仅仅是两次。

感谢任何帮助,即使这只是一个更好的提问方式。

谢谢

编辑:

我想多给我一点背景知识,解释一下为什么我需要维持秩序,可能会更有用。以下是我目前掌握的情况:

假设faces=[1,2,3]#实际上这是一个随机长度列表,带有随机值new_faces=faces rolls=random number prob=[5、.333333、.1666666]#这是一个一致的随机概率列表。新_prob=prob

#en stands for enumerated.
en_new_faces = [(index_2, y_face) for index_2, y_face in enumerate(new_faces)]
en_faces = [(index_1, x_face) for index_1, x_face in enumerate(faces)]


#Why new faces? For the first roll, the possible sums are the same as the value on the faces of the die, but on the second roll we start to have combos and a number of unique sums/possible outcomes is greater than the number of faces on the original die. On the 3ed roll we need to treat each unique sum like a face of one of our dice because each unique sum can be increased by any of the values on the faces of our original die, but we don’t need to apply this to each unique combo because adding 3 to combo (2 + 2) and adding 3 to (1 + 3) gives us the same outcome. So:

new_faces=list((w, x, y, z)for w, x inen_facesfor y, z inen_new_facesif w

#卷

#new_list find the sum of combos that happen twice such as (1,3) & (3,1)
new_list = [(x+z) for w,x,y,z in new_faces if w != y]

#even_list finds the sum of combos that happen once such as (1,1) or (2,2). Even though the combos only happen once, the sum may not be unique.
even_list = [(x+z) for w,x,y,z in new_faces if w == y]

这些列表是分开的,因为偶数列表组合的概率是(1/(len(面)**卷)),new_list组合的概率是(2/(len(面)**卷))

通过保持列表有序,我们可以保持它,以便无论我们经历多少次滚动,第一个数字的概率发生一次,new_faces中剩余数字的概率发生两次。

Here is how i’ve been keeping it in order:
for (x) in even_list:
    new_list.append(x) 
new_list = list(reversed(new_list))
rolls = rolls - 1

这就引出了我的问题。

共有2个答案

薛祯
2023-03-14

IIUC,您可以在迭代列表时使用enumerate来跟踪索引和值:

condenced_sums = []
condenced_probs = []

for i, x in enumerate(sums):
    if x not in condenced_sums:
        condenced_sums.append(x)
        condenced_probs.append(Probs[i])
谷梁宏恺
2023-03-14

您应该使用映射数据结构来收集总和:

from collections import OrderedDict

d = OrderedDict()

for s, p in zip(Sums, Probs):
    d[s] = d.get(s, 0) + p

Sums = [*d.keys()]
Probs = [*d.values()]
 类似资料:
  • 挺久没更新新的模组树游戏了,今天来一个吧,这个Mod的玩法也算新颖。

  • 问题内容: 如何将一个列表拆分为给定数量的列表,按顺序排列元素并将它们分配给子列表(因此不对列表进行分区)? 我想尽可能做到“不错”(使用Java 8功能或Guava或类似功能)。 示例列表: 应该分为3: 应该分成2个: 问题答案: 如果源列表支持有效的随机访问,则可以使用 例如

  • 问题内容: 假设我有3个列表:[‘q’,’w’],[‘a’,’s’],[‘z’,’x’]。如何从这些列表中获取可能的组合列表?所以我得到一个列表[[‘q’,’a’,’z’],[‘q’,’s’,’z’]]等。我为两个方法创建了一个方法,但对N个列表却找不到一个方法: 我发现这是由番石榴的Sets.cartesianProduct完成的。 问题答案: 您需要N个嵌套循环,这使它变得很难。 您可以使用递

  • 我想要一个列表,它是列表元素列表的组合,例如:我的输入 输出应该是 非常感谢您的帮助。

  • 问题内容: 这是我的代码,也许您会立即注意到我所缺少的内容: 我正在尝试在CustomerId现有节点之前插入新的node()。这是我的XML示例文件: 这是一个抛出异常,我只是不知道还能尝试什么: NOT_FOUND_ERR:尝试在不存在的上下文中引用该节点。 问题答案: 在这里,我只是使用您提供的xml示例进行了测试的示例。 结果如下: 如果您有兴趣,这是我用来显示结果的示例代码:

  • 问题内容: 假设我有一个这样的Python清单: 我想在每个第n个元素后插入一个“ x”,比方说该列表中的三个字符。结果应为: 我知道我可以通过循环和插入来做到这一点。我实际上正在寻找的是Pythonish方式,也许是单线? 问题答案: 我有两个一线客轮。 鉴于: 使用获得指数,增加每3次字母, 如 :,然后连接成字符串和它。 [‘a’, ‘b’, ‘c’, ‘x’, ‘d’, ‘e’, ‘f’,