Python — Как я могу избежать дублирования (списка)?

#python

Вопрос:

 import random
d = [0,0,0,0,0,0,0,0,0,0,0,0,0]
for i in range(1, 13):
    d[i] = random.randint(0,10)
    print(d)

for i in range(10):            
    perturbdp = random.randint(1,12)
    d[perturbdp] = random.randint(0,10)
    print(perturbdp)
    print(d)    
 

Выход:

 [0, 3, 5, 1, 2, 2, 10, 0, 8, 0, 4, 8, 8]
8
[0, 3, 5, 1, 2, 2, 10, 0, 7, 0, 4, 8, 8]
10
[0, 3, 5, 1, 2, 2, 10, 0, 7, 0, 9, 8, 8]
9
[0, 3, 5, 1, 2, 2, 10, 0, 7, 2, 9, 8, 8]
10
[0, 3, 5, 1, 2, 2, 10, 0, 7, 2, 6, 8, 8]
12
[0, 3, 5, 1, 2, 2, 10, 0, 7, 2, 6, 8, 8]
12
[0, 3, 5, 1, 2, 2, 10, 0, 7, 2, 6, 8, 2]
8
[0, 3, 5, 1, 2, 2, 10, 0, 8, 2, 6, 8, 2]
6
[0, 3, 5, 1, 2, 2, 1, 0, 8, 2, 6, 8, 2]
7
[0, 3, 5, 1, 2, 2, 1, 6, 8, 2, 6, 8, 2]
10
[0, 3, 5, 1, 2, 2, 1, 6, 8, 2, 6, 8, 2]
 

Я создал случайные списки в соответствии с кодом.

Когда я выполняю итерацию для дальнейшей генерации, выбирая какую-либо позицию, она выбирает и заменяет значение тем же значением. Пожалуйста, посмотрите последние 3 строки из раздела «Вывод». Он выбрал позицию 10 и снова заменил ее на 6. Как мы можем этого избежать?

Комментарии:

1. продолжайте рисовать до тех пор, пока значение не будет отличаться от исходного?

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

Ответ №1:

Повторяйте до тех пор, пока оно не станет отличаться от текущего значения:

 for i in range(10):            
    perturbdp = random.randint(1,12)
    new_value = random.randint(0,10)
    while new_value == d[perturbdp]:
        new_value = random.randint(0,10)
    d[perturbdp] = new_value
    print(perturbdp)
    print(d)  
 

Если вы не хотите, чтобы ваши результаты повторялись, вам нужно будет повторить все возможные комбинации:

 from itertools import combinations_with_replacement
import random

comb = combinations_with_replacement(range(11), 13) # all 13-elements combinations of int between 0 and 10
comb_r = [*comb]        # putting them in a list
random.shuffle(comb_r)  # shuffling the list

number_of_outputs = 10
for i in range(number_of_outputs):
    print(list(comb_r[i]))
 

Комментарии:

1. Похоже, это работает. Я просто повторяю с большим числом, чтобы проверить, работает ли это так, как ожидалось. Я буду держать вас в курсе. Спасибо.

2. Я увеличил число итераций с 10 до 100. Я вижу это [0, 6, 10, 0, 2, 9, 8, 5, 5, 3, 1, 0, 1] повторяется во время итерации. Это повторяется не сразу после, а где-то посередине. Ваш пример гарантирует, что значения будут сгенерированы сразу после (немедленно).

3. В этом случае вам понадобится другой подход: повторите комбинации. Если вы пойдете совершенно случайным образом, некоторые элементы в конечном итоге повторятся. Я обновил свой ответ. При таком альтернативном решении повторения не произойдет.

Ответ №2:

Вы можете использовать random.choice для выбора чисел из списка потенциальных значений

 for i in range(10):
    perturbdp = random.randint(1, 12)
    nums = list(range(0, d[perturbdp]))   list(range(d[perturbdp]   1, 11))
    d[perturbdp] = random.choice(nums)
    print(perturbdp)
    print(d)
 

Выход

 5
[0, 6, 9, 7, 2, 1, 4, 5, 3, 3, 8, 4, 2]
1
[0, 1, 9, 7, 2, 1, 4, 5, 3, 3, 8, 4, 2]
5
[0, 1, 9, 7, 2, 6, 4, 5, 3, 3, 8, 4, 2]
3
[0, 1, 9, 3, 2, 6, 4, 5, 3, 3, 8, 4, 2]
6
[0, 1, 9, 3, 2, 6, 6, 5, 3, 3, 8, 4, 2]
3
[0, 1, 9, 1, 2, 6, 6, 5, 3, 3, 8, 4, 2]
7
[0, 1, 9, 1, 2, 6, 6, 4, 3, 3, 8, 4, 2]
7
[0, 1, 9, 1, 2, 6, 6, 1, 3, 3, 8, 4, 2]
10
[0, 1, 9, 1, 2, 6, 6, 1, 3, 3, 5, 4, 2]
8
[0, 1, 9, 1, 2, 6, 6, 1, 7, 3, 5, 4, 2]
 

Комментарии:

1.Спасибо, что ответили. Здесь значения (одна и та же строка) повторяются. 7 [0, 10, 10, 0, 0, 2, 1, 9, 1, 3, 10, 0, 10] 11 [0, 10, 10, 0, 0, 2, 1, 9, 1, 3, 10, 0, 10]

2. Это не мешает новому d[perturbdp] быть неизменным между двумя итерациями (по крайней мере, это ожидалось ОП в моем понимании проблемы)

3. @JustLearn вы имеете в виду, что хотите, чтобы каждый список имел уникальные значения?

4. @Guy Он не должен повторять ни одно из предыдущих 13 значений в списке. В вашем примере было выбрано 11, и он пытается изменить 11-ю позицию с тем же значением, которое уже было там.

5. @Парень, это работает. Если мне нужно сгенерировать случайное число между a и b (включая a, b) и умножить на 100, как я могу этого достичь? я пытался изменить ваш код, но он не работает