Держите Python от предоставления повторяющихся выходов - PullRequest
0 голосов
/ 02 июля 2019

Моя цель состоит в том, чтобы диапазон элементов предоставлял как можно больше выходных данных, но без дублированных выходных данных.Код, который я предоставил, представляет собой небольшой пример того, над чем я работаю.Что касается моего большего набора данных, я заметил, что дубликаты выводов мешают файлу CSV при запуске скрипта, поэтому мне было интересно, есть ли способ не допустить обработки дубликатов при сохранении высокого диапазона (100, 250, 400 и т. Д.)?

import random
Saying = ["I Like"]

Food = ['Coffee', 'Pineapples', 'Avocado', 'Bacon']
Holiday = ['on the 4th of July', 'on April Fools', 'during Autumn', 'on Christmas']

for x in range(10):
    One = random.choice(Saying)
    Two = random.choice(Food)
    Three = random.choice(Holiday)
    print(f'{One} {Two} {Three}')

Спасибо за помощь!

Ответы [ 4 ]

0 голосов
/ 02 июля 2019

Вы можете генерировать случайный вывод при сохранении данных без избыточности следующим образом:

  1. Сначала создайте список permutations, который в основном является продуктом списков, подлежащих перестановке.
permutations = list(itertools.product(*Statement))
## Example - [('I Like', 'Coffee', 'on the 4th of July'), ('I Like', 'Coffee', 'on April Fools'), ('I Like', 'Coffee', 'during Autumn'), ('I Like', 'Coffee', 'on Christmas')]
Выберите элементы из permutations путем случайного выбора индекса и его печати. ​​
 num = int(random.random() * total_elements)
 print '{} {} {}'.format(permutations[num][0], permutations[num][1], permutations[num][2])
Далее мы удаляем элемент из списка permutations, чтобы избежать избыточности.
del permutations[num]

Полный код:

import itertools, random
Saying = ["I Like"]

Food = ['Coffee', 'Pineapples', 'Avocado', 'Bacon']
Holiday = ['on the 4th of July', 'on April Fools', 'during Autumn', 'on Christmas']

Statements = [Saying, Food, Holiday]

permutations = list(itertools.product(*Statements))

random.seed()

total_elements = len(Saying) * len(Food) * len(Holiday)

while total_elements > 0:
    num = int(random.random() * total_elements)
    print '{} {} {}'.format(permutations[num][0], permutations[num][1], permutations[num][2])
    del permutations[num]
    total_elements = total_elements - 1
0 голосов
/ 02 июля 2019

Вы можете использовать np.random.choice с параметром replace=False. Более того, вы можете сэмплировать столько сэмплов, сколько хотите, используя аргумент size.

import numpy as np

Food = ['Coffee', 'Pineapples', 'Avocado', 'Bacon']
Holiday = ['on the 4th of July', 'on April Fools', 'during Autumn', 'on Christmas']

np.random.choice(Food, size=4, replace=False)
>>> array(['Avocado', 'Coffee', 'Pineapples', 'Bacon'], dtype='<U10')

np.random.choice(Holiday, size=4, replace=False)
>>> array(['on April Fools', 'on the 4th of July', 'during Autumn',
       'on Christmas'], dtype='<U18')
0 голосов
/ 02 июля 2019

Проблема в том, что у вашего бота (я полагаю?) Нет памяти о том, какие результаты были до сих пор, поэтому на самом деле нет способа проверить с помощью имеющегося кода.

Попробуйте вместо этого:

import random
Saying = ["I Like"]

Food = ['Coffee', 'Pineapples', 'Avocado', 'Bacon']
Holiday = ['on the 4th of July', 'on April Fools', 'during Autumn', 'on Christmas']

memory=[]
done = False

while not done:
    One = random.choice(Saying)
    Two = random.choice(Food)
    Three = random.choice(Holiday)

    if f'{One} {Two} {Three}' not in memory:
        memory.append(f'{One} {Two} {Three}')
        if len(memory) == 10:
            done = True

[print(item) for item in memory]

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

0 голосов
/ 02 июля 2019

Вы можете использовать set с элементом, который вы уже видели, а затем проверить, видите ли вы элемент в set со сложностью O (1) в среднем.

Другой вариант - перетасовать ваш список и добавить элемент:

import random

random.shuffle(lst)

while lst:
    element = x.pop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...