Создание списков, заполненных уникальными целочисленными значениями в Python - PullRequest
0 голосов
/ 05 февраля 2019

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

В любом случае, я начал изучать python и выполнял некоторые упражнения.Мне нужно было создать список, в котором есть 10 случайно сгенерированных целых чисел, и каждое целое число должно иметь свое значение.

Поэтому я попытался сравнить первый элемент списка со следующим, и если они 'Тем не менее, я попытался сгенерировать новое число с помощью оператора if.

import random

listA = []

for i in range(0,10):
    x=random.randint(1,100)

    if listA[i] == listA[i-1]:
        x=random.randint(1,100)
    else:
        listA.append(x)

listA.sort()
print(listA)

Но у меня есть сообщение об ошибке;«индекс списка выходит за пределы диапазона»

Я ожидал, что оператор if будет начинаться с индекса «0» и будет считаться до 9-го индекса «listA» и, если он идет, сравнивать их, если они совпадают,сгенерировать другое случайное число.Но, очевидно, моя индексация была неправильной.

Также будут приветствоваться любые другие комментарии к коду.

Спасибо за ваше время заранее.

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

В Python set может содержать только уникальные значения, поэтому в следующем коде повторяющиеся случайные числа не увеличат длину набора:

import random

s = set()
while len(s) < 10:
    s.add(random.randint(1,100))

print(sorted(s))

Вывод:

[18, 20, 26, 48, 51, 72, 75, 92, 94, 99]
0 голосов
/ 05 февраля 2019

Это можно рассматривать как выборка без замены .В этом случае вы «отбираете» 10 элементов случайным образом из range(1, 101), и каждый элемент, который отбирается, может быть отобран только один раз (т. Е. Он не «заменяется» - представьте, что вы случайным образом выбираете пронумерованные шарики из сумки, чтобы понять концепцию).).

Выборка без замены может быть обработана в одну строку:

import random
listA = random.sample(range(1, 101), 10)

Другой способ думать об этом - перемешать list(range(1, 101)) и взять первые 10 элементов:

import random
listA = list(range(1, 101))
random.shuffle(listA)
listA[:10]

Время различных подходов

Используя магию %timeit в iPython , мы можем сравнить различные подходы, предложенные в ответах:

def random_sample():
    import random
    return sorted(random.sample(range(1, 101), 10))

def random_shuffle():
    import random
    listA = list(range(1, 101))
    random.shuffle(listA)
    return sorted(listA[:10])

def while_loop():
    import random
    listA = []
    while(len(listA) < 10):
        x = random.randint(1, 100)
        if x not in listA:
            listA.append(x)
    return sorted(listA)

def random_set():
    import random
    s = set()
    while len(s) < 10:
        s.add(random.randint(1, 100))
    return sorted(s)

%timeit for i in range(100): random_sample()
# 1.38 ms ± 17.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit for i in range(100): random_shuffle()
# 6.81 ms ± 104 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit for i in range(100): while_loop()
# 1.61 ms ± 18.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit for i in range(100): set_approach()
# 1.48 ms ± 19.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
0 голосов
/ 05 февраля 2019

Попробуйте следующее.

import random

listA = []

while(len(listA) < 10):
    x = random.randint(1,100)
    if x not in listA:
        listA.append(x)

listA.sort()
print(listA)

Объяснение:

Вам следует использовать цикл while, чтобы вы продолжали генерировать числа, пока желаемый список не станет фактически 10 числами.При использовании цикла for, если вы случайно сгенерировали [2, 2, 30, 40, 2, 10, 20, 83, 92, 29] случайным образом, ваш список будет состоять только из 8 чисел, потому что дубликаты 2 не будутдобавлено, хотя вы уже перебрали цикл for 10 раз.

Хотя ключом здесь является , так как вы никогда не сможете обмануть, предсказать, сколько раз потребуется, чтобы случайным образом получить10 различных чисел, поэтому вы хотите продолжать идти , в то время как вы не достигли желаемой длины.

Кроме того, ключевое слово в - это простой способ проверить,что-то уже существует внутри чего-то другого.

...