【问题标题】:Adding probabilities to items in a list of lists向列表列表中的项目添加概率
【发布时间】:2021-08-18 18:41:37
【问题描述】:

我想为列表中的每个项目添加概率,而该列表在另一个列表中。

一些伪代码:

myList = [ [a, b, c, d], [e, f, g, h], [i, j, k, l], [m, n, o], [p, q, r], [s, t, u] ]

probabilities = [ [0.6, 0.3, 0.075, 0.025], [0.6, 0.3, 0.075, 0.025], [0.6, 0.3, 0.075, 0.025], [0.55, 0.35, 0.1], [0.55, 0.35, 0.1], [0.55, 0.35, 0.1] ]

有没有办法做到这一点?

进一步:

我的需要是创建另一个类似于下面的列表...

newList = [ [b, e, k, o, p, s], [a, f, i, m, r, t], ... etc. ] 

在给定概率的情况下,随机选择每个元素,并且 newList 中没有两个列表是相同的。我不确定这是否可以实现。

到目前为止我的代码:

layers = [list(Path(directory).glob("*.png")) for directory in ("dir1/", "dir2/", "dir3/", "dir4/", "dir5/", "dir6/")]

list_of_prob = [[0.6, 0.3, 0.075, 0.025], [0.6, 0.3, 0.075, 0.025], [0.6, 0.3, 0.075, 0.025], [0.6, 0.3, 0.1], [0.6, 0.3, 0.1], [0.6, 0.3, 0.1]]

rwp = [choices(layers, list_of_prob, k=????)]

rand_combinations = [([choice(k) for k in layers]) for i in choice_indices]

我不完全确定choices() 中的k 是什么,例如。列表的数量或列表中的总元素数。 Layers 是图片路径的列表,.pngs,与上面伪代码中提供的“myList”格式相同(dir1 中 4 个图像,dir2 中 4 个图像,dir3 中 4 个图像,dir4 中 3 个,dir5 中 3 个, 3 在 dir6)。

我已经有代码可以遍历列表并创建随机图像,但我希望仅在 x% 的时间内生成一些图像。因此,我原来的问题。对不起,如果我只是把事情复杂化了,我试着简化它。

【问题讨论】:

  • 放心,你想做的绝对是可能的。您可以发布您到目前为止编写的代码来尝试执行此操作吗?
  • myList 的元素应该是字符串吗?你需要引用它们。
  • 使用 random.choices() 及其 weights 参数。
  • 我从技术上理解您的问题,这并不难:首先,使用概率重新排序每个列表,然后使用merge them together using itertools.zip_longest 并过滤掉Nones。但是从数学上讲,你如何在不被概率替换的情况下订购东西?您是否只是删除选择元素的概率,将其余部分相加并将所有其余部分除以它们的总和?您是否一直选择元素,直到您至少选择了每个元素?是一样的吗?
  • @Barmar 不,它们实际上是图像路径。我使用“a,b,c ...”作为伪代码。我试过 random.choices() 但它似乎不喜欢那种语法

标签: python probability nested-lists


【解决方案1】:

我将myList 转换为字符串只是为了方便。

这将创建组合并将它们附加到newList,而忽略newList中已经存在的任何组合

newList的长度等于myList的长度时循环结束

import random

myList = [['a', 'b', 'c', 'd'], 
          ['e', 'f', 'g', 'h'], 
          ['i', 'j', 'k', 'l'], 
          ['m', 'n', 'o'], 
          ['p', 'q', 'r'], 
          ['s', 't', 'u']]

probabilities = [[0.6, 0.3, 0.075, 0.025], 
                 [0.6, 0.3, 0.075, 0.025], 
                 [0.6, 0.3, 0.075, 0.025], 
                 [0.55, 0.35, 0.1], 
                 [0.55, 0.35, 0.1], 
                 [0.55, 0.35, 0.1]]
newList = []

def random_list():
    combo = []
    for d, p in zip(myList, probabilities):
        choice = random.choices(d, p)
        combo.append(''.join(choice))
    return combo

while len(newList) < len(myList):
    a = random_list()
    if a not in newList:
        newList.append(a)

newList 的结果:

[['b', 'f', 'k', 'm', 'q', 's'],
 ['a', 'e', 'j', 'm', 'q', 't'],
 ['b', 'f', 'k', 'm', 'q', 'u'],
 ['a', 'f', 'i', 'm', 'p', 's'],
 ['a', 'e', 'i', 'n', 'p', 't'],
 ['b', 'f', 'k', 'm', 'r', 'u']]

【讨论】:

  • 这实际上效果很好,我传递的是图像路径而不是字符,但它仍在做我想做的事情。只需要弄清楚一些小问题,这应该会很好用!
  • @DominickFiducia 很高兴我能帮上忙! :)
  • 欣赏!!
【解决方案2】:

因此,如果我理解正确,您希望根据概率从myList 的每个子列表中获取一个元素以获取一个元素,并多次执行此操作以获取列表列表。

使用 Python 3,您可以:

import random
# the new set since two elements cannot be the same
result_set = set()
# the number of times you want to do it, you can change it.
for i in range(5):
    # A single result as a str, hashable.
    result = ""
    for chars, char_probabilities in zip(myList, probabilities):
    # weighted random choice
    char = random.choices(chars, char_probabilities)
    result += char[0]
    result_set.add(result)

result_list = [list(elt) for elt in result_set]

【讨论】:

  • 这似乎是朝着正确方向迈出的一步,但我如何才能强制每个列表中的 1 个元素最终出现在 result_list 中?运行此命令后,我看到 result_list 中的某些元素在相应列表中的元素少于 6 个,而我总是希望每个列表中有 6 个元素被添加到 result_list。谢谢!
  • 嗯,奇怪,这是运行该代码的示例结果:[['a', 'e', 'k', 'n', 'p', 's'], [ 'a', 'g', 'l', 'm', 'p', 't'], ['a', 'e', 'i', 'n', 'p', 's'] , ['a', 'e', 'i', 'n', 'q', 'u'], ['c', 'f', 'i', 'n', 'p', 't ']]
  • 啊,好吧!那么绝对正确,我没有在可能是问题的 char 列表中使用它。抱歉,我不想在我的原始帖子中使事情过于复杂......我实际上将它用于图像路径列表,所以对象。我正在尝试弄清楚目前如何将您的代码用于图像路径列表
  • 我必须看一个最小的可复制示例才能了解如何调整解决方案。
  • 所以这是添加到 result_list 的列表之一。我选择这个是因为它确实有 6 个元素。有些人更少。但这些是我传递的对象。 [[WindowsPath('dir1/img1.png')], [WindowsPath('dir2/img3.png')], [WindowsPath('dir3/img2.png')], [WindowsPath('dir4/img1.png' )], [WindowsPath('dir5/img1.png')], [WindowsPath('dir6/img2.png')]]
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
相关资源
最近更新 更多