#python #python-3.x
#python #python-3.x
Вопрос:
Очень новичок в Python. У меня есть 20 чисел в списке, я хочу 2 уникальных значения каждый раз. Таким образом, в идеале у меня получается 10 строк, и в каждой строке есть два уникальных номера, которые ранее не использовались. У меня есть что-то подобное, но оно отображает число более одного раза.
numberList=["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"]
myset = set(numberList)
rows = len(numberList)//2
i = 0
while i < rows:
random_nums = random.sample(myset,2)
print(random_nums)
i = 1
OUTPUT:
['13', '8']
['19', '8']
['11', '9']
['16', '7']
['1', '10']
['11', '20']
['16', '18']
['18', '2']
['20', '10']
['7', '4']
Комментарии:
1. Итак, 10 пар уникальных значений (набор из 2) ранее не встречались в списке?
2. удалите их из списка после выборки
3. важное различие, которое следует сделать @depperm, заключается в том, что его следует удалить из копии списка, поскольку мы не хотим выполнять итерации по списку, который меняется
4. или просто создайте список, в котором хранятся числа, а затем проверьте, есть ли они в этом списке
5. np.random.shuffle(x); для r в np.reshape(x, (10,2)): печать(r)
Ответ №1:
Предполагая:
- Вам не нужно
numberList
позже - Необходимое количество пар делит длину списка без напоминания
Вы можете использовать этот довольно простой и эффективный подход. Выборка 2 случайных элементов из списка и удаление их до тех пор, пока список не станет пустым.
import random
numberList = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18",
"19", "20"]
while numberList:
a, b = random.sample(numberList, 2)
numberList.remove(a)
numberList.remove(b)
print(a, b)
Пример вывода:
9 14
13 12
7 5
10 2
15 20
19 4
11 1
18 3
17 6
8 16
Если вам действительно нужно использовать numberList
позже в вашем коде, следующим эффективным подходом будет обработка набора выбранных элементов. Вам понадобится немного более сложная логика:
import random
numberList = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18",
"19", "20"]
taken = set()
pairs = len(numberList) // 2
for _ in range(pairs):
a, b = None, None
while a is None or a in taken:
a = random.choice(numberList)
taken.add(a)
while b is None or b in taken:
b = random.choice(numberList)
taken.add(b)
print(a, b)
Ответ №2:
Вы можете удалить элементы из «numberList» или, лучше сказать, «myset».
import random
numberList=["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"]
myset = set(numberList)
rows = len(numberList)//2
i = 0
while i < rows:
random_nums = random.sample(myset,2)
myset.remove(random_nums[0])
myset.remove(random_nums[1])
print(random_nums)
i = 1
Ответ №3:
У вас мог бы быть еще один объект:
seen = set()
И в теле цикла while:
while i < rows:
random_nums = set(random.sample(myset,2))
if not random_nums.issubset(seen):
print(random_nums)
seen.update(random_nums)
i = 1
Ответ №4:
Если я правильно вас понял, то вам не нужно повторять цифры. Например, если число появлялось раньше, оно не должно появляться снова. Тогда вы, вероятно, сможете соответствующим образом удалить элементы myset
. Вот так:
import random
numberList=["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"]
myset = set(numberList)
rows = len(numberList)//2
i = 0
while i < rows:
random_nums = random.sample(myset,2)
myset.remove(random_nums[0])
myset.remove(random_nums[1])
print(random_nums)
i = 1
Ответ №5:
это должно сработать
from random import choice
numberList =
["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17",
"18","19","20"]
for i in range(10):
a = choice(numberList)
numberList.pop(numberList.index(a))
b = choice(numberList)
numberList.pop(numberList.index(b))
print([a, b])
Ответ №6:
Поскольку списки становятся большими, выборка и удаление требуют больше работы, чем вам нужно, и будут неэффективными. Вместо этого используйте np.random.shuffle
numberList= ["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"]
np.random.shuffle(numberList)
for r in np.reshape(numberList, (10,2)):
print(r)
Вывод:
['18' '20']
['17' '16']
['11' '1']
['5' '13']
['7' '14']
['19' '15']
['6' '8']
['9' '12']
Ответ №7:
Вы могли бы использовать random.shuffle
для выполнения этой работы следующим образом:
import random
numberList=["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"]
random.shuffle(numberList)
rows = len(numberList)//2
for i in range(rows):
random_nums = numberList[2*i:2*i 2]
print(random_nums)
Обратите внимание, что это random.shuffle
изменяет список на месте, т. Е. Если вы добавите print(numberList)
в конце моего кода, он напечатает 20 чисел, но в случайном порядке.
Ответ №8:
Для начала, если вы знаете, что всегда будете работать с целыми числами, я думаю, было бы проще преобразовать их все в целые числа, как я сделал в следующем примере с пониманием списка. Поскольку вы указываете ровно 20 чисел и 10 пар, я жестко закодировал эти числа в скрипте, но вы можете легко установить переменные вместо них.
import random
numberList = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20"]
# If you know you always have numbers, convert them all to integers → easier
numberList = [int(x) for x in numberList]
myset = set() # Will be used to add any number NOT seen before
numberList_pairs = [] # Will be used to build a list of unique pairs
while len(numberList_pairs) < 10: # You need 10 pairs in that new list
pair = []
# While you don't have a unique pair, keep generating random numbers
while len(pair) < 2:
random_num = random.randint(1, 20) # 1 to 20. Both ends are included
# If the number hasn't been seen before
if random_num not in myset:
myset.add(random_num)
pair.append(random_num)
numberList_pairs.extend([pair]) # Add the pair as a list
for pair in numberList_pairs:
print(pair)
Вот пример вывода:
[20, 14]
[16, 2]
[13, 10]
[6, 12]
[9, 18]
[3, 19]
[17, 11]
[1, 5]
[8, 4]
[15, 7]
Примечание: Если вам действительно нужно, чтобы выходные данные представляли собой списки строк, вы можете преобразовать обратно в строки в последнем цикле следующим образом:
for a, b in numberList_pairs:
a, b = str(a), str(b)
print([a, b])
И вы получите тот же результат, что и первоначально опубликованный:
['11', '9']
['2', '15']
['7', '12']
['13', '3']
['19', '20']
['1', '14']
['16', '5']
['18', '8']
['10', '6']
['4', '17']