Цикл Python 3.5 для генерации нового списка каждую итерацию - PullRequest
0 голосов
/ 11 декабря 2019

Я пытаюсь написать некоторый код, который (псевдослучайно) генерирует список из 7 чисел. У меня это работает на один прогон. Я хотел бы иметь возможность зациклить этот код для создания нескольких списков, которые я могу вывести в текстовый файл (мне не нужна помощь с этим, я вполне комфортно работаю с вводом / выводом и файлами :)

Я сейчас использую этот код (спасибо Джейсону за то, что он так далеко):

import random

pool = []
original_pool = list( range( 1,60))

def selectAndPrune(x):
        pool = []
        list1 = []
        random.shuffle(pool)
        pool = original_pool.copy()
        current_choice = random.choice(pool)
        list1.append(current_choice)
        pool.remove(current_choice)
        random.shuffle(pool)
        print(list1)

def repeater():
    for i in range(19):
        pool_list = []
        pool = original_pool.copy()
        a = [ selectAndPrune(pool) for x in range(7)]
        pool_list.append(a)

repeater()

Это дает вывод отдельных списков значений, таких как:

[21]
[1]
[54]
[48]
[4]
[32]
[15]
etc.

ВыводЯ хочу это 19 списков, все из которых содержат 7 случайных чисел:

[1,4,17,23,45,51,3] 
[10,2,9,38,4,1,24]
[15,42,35,54,43,28,14]
etc

1 Ответ

1 голос
/ 11 декабря 2019

Если я правильно понимаю вопрос, цель состоит в том, чтобы повторить функцию 19 раз. Однако эта функция медленно удаляет элементы из списка при каждом вызове, делая невозможным выполнение за пределами пула , как в настоящее время написано в вопросе . Я подозреваю, что решение выглядит примерно так:

import random

def spinAndPrune():
    random.shuffle( pool )
    current_choice = random.choice( pool )
    pool.remove( current_choice )
    random.shuffle( pool )
    return current_choice

Сначала я добавил команду возврата в конце вызова функции. Затем вы можете сделать копию исходного пула, чтобы можно было повторять его столько раз, сколько необходимо. Также вам необходимо сохранить списки, которые вы хотите сохранить:

# create an original pool of values
original_pool = list( range( 1, 60 ) )

# initialize a variable that stores previous runs
pool_list = []

# repeat 19 times
for i in range( 19 ):

    # create a copy of the original pool to a temporary pool
    pool = original_pool.copy()

    # run seven times, storing the current choice in variable a
    a = [ spinAndPrune() for x in range( 7 ) ]

    # keep track of variable a in the pool_list
    pool_list.append( a )
    print( a )

Обратите внимание на функцию .copy(), чтобы сделать копию списка. Кроме того, range() позволяет легко создавать списки, содержащие целые числа 1-59.

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

# print first list
print( pool_list[ 0 ] )

# print fifth list
print( pool_list[ 4 ] )

# print all the lists
print( pool_list )
...