damir77716
@damir77716
Не адекватный инноватор

Как заполнить массив python без повторений?

dot=[]
def generate():
    global dot
    dot.append([random.randrange(0, dots), random.randrange(0, dots)])
    while len(dot)<dots-1:
        randX = random.randrange(0, dots)
        randY = random.randrange(0, dots)
        for i in range(len(dot)):
            if dot[i][0]!=randX and dot[i][1]!=randY:
                dot.append([random.randrange(0, dots), random.randrange(0, dots)])
  • Вопрос задан
  • 3434 просмотра
Пригласить эксперта
Ответы на вопрос 3
@kgbplus
Просто и сильно быстрее
def generate(dots):
    dot = list(range(dots))
    for i in range(dots):
        x = random.randrange(0, dots)
        dot[i] , dot[x] = dot[x], dot[i]
    return dot

dot = generate(dots)
Ответ написан
sim3x
@sim3x
Решение влоб
In [3]: from random import randint

In [4]: def t(list_len=10):
    list_ = []
    while len(list_) < list_len:
        r = randint(0, list_len * 10)
        if r not in list_: list_.append(r)
    return list_
   ...: 

In [5]: t()
Out[5]: [34, 21, 49, 40, 81, 78, 95, 63, 31, 29]

In [6]: t(20)
Ответ написан
Sly_tom_cat
@Sly_tom_cat
.
Прямо в лоб красивее, думаю, не решить. Но можно заменить список из двух рандомов на tuple, а список из списков - set-ом...по крайней мере на время заполнения.
Получится чуть красивее (по крайней мере с моей точки зрения) :

from random import randint

def generate(dots):
  a = set()
  while len(a) < dots:
    a.add((randint(0, dots), randint(1, dots)))
  return list(a)


Если нужно все таки список из списков, то тогда последнюю строчку заменить на
return [list(i) for i in list(a)]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы