цикл над списком и вывод двух уникальных чисел

#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']