Правильно ли этот метод петли? Python 3.4.3

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

Я не уверен, что это будет работать во всех случаях, и задаться вопросом, есть ли лучший способ сделать это.

import random positionList = [] for i in range(6): position = [random.randint(0,5),random.randint(0,5)] print("Original", position) while position in positionList: position = [random.randint(0,5),random.randint(0,5)] positionList.append(position) print(position) 

Может ли позиция переделать то же самое, что и другие позиции в списке?

Может ли позиция переделать то же самое, что и другие позиции в списке?

Да, потому что вы используете случайные. Если вы хотите быть уверены, что сохраняете уникальные предметы, вы можете использовать set объектов для этой цели, которые сохраняют уникальные предметы для вас. Но обратите внимание, что поскольку списки не являются хешируемыми объектами, вы должны использовать хешируемый контейнер для пар (например, кортеж):

 >>> position_set = set() >>> >>> while len(position_set) != 6: ... position = (random.randint(0,5), random.randint(0,5)) ... position_set.add(position) ... >>> position_set set([(3, 2), (5, 0), (2, 5), (5, 2), (1, 0), (3, 5)]) 

Если вам действительно нужны списки, вы можете конвертировать, если не просто оставить код как есть:

 import random position_set = set() for i in range(6): position = random.randint(0, 5), random.randint(0, 5) print("Original", position) while position in position_set: position = random.randint(0, 5), random.randint(0, 5) position_set.add(position) print(position) print(position_set) 

Поиск по набору – это O(1) vs O(n) для списка, так как порядок кажется несущественным, просто использовать множество, вероятно, достаточно.

Чтобы убедиться в 6 разных элементах, вы можете использовать random.shuffle :

 from random import shuffle all=[(x,y) for x in range(5) for y in range(5)] shuffle(all) print(all[:6]) """ [(0, 1), (3, 4), (1, 1), (1, 3), (4, 3), (0, 0)] """ 

Я просто запускаю ваш код, и, похоже, он работает очень хорошо. Я считаю, что это правильно. Давайте рассмотрим ваш цикл while.

Вы проверяете, находится ли случайная сгенерированная «позиция» уже в списке «positionList». Простое заявление:

 position in positionList 

возвращает True или False. Если «позиция» уже отображается в вашем списке, цикл while выполняется. И вы просто вычисляете другую случайную позицию.

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

Это один из способов сделать это

 import random my_list =[] num_of_points = 6 while True: position = [random.randint(0,5),random.randint(0,5)] if position not in my_list: my_list.append(position) print num_of_points num_of_points -=1 if (num_of_points == 0): break print my_list 

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