Я хочу добавить вероятности к каждому элементу в списке, где этот список находится в другом списке.

Какой-то псевдокод:

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]

Я не совсем уверен, какое k будет в choices (), например. количество списков или общее количество элементов в списках. Слои - это список путей к изображениям, .png, который идентичен формату "myList", представленному выше в псевдокоде (4 изображения в dir1, 4 изображения в dir2, 4 изображения в dir3, 3 в dir4, 3 в dir5, 3 в dir6).

У меня уже есть код для перебора списка и создания случайных изображений, но я хочу, чтобы некоторые изображения генерировались только в x% случаев. Отсюда мой первоначальный вопрос. Извините, если я просто усложнил, я попытался упростить.

1
Dominick Fiducia 18 Авг 2021 в 21:41

2 ответа

Лучший ответ

Я преобразовал myList в струнные, чтобы упростить задачу.

Это создаст комбинации и добавит их в newList, игнорируя любые комбинации, которые уже существуют в newList

Цикл while заканчивается, когда длина 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']]
1
fthomson 18 Авг 2021 в 19:52

Итак, если я правильно понял, вы хотите взять один элемент из каждого подсписка 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]
0
Kevin Eaverquepedo 18 Авг 2021 в 18:57