Моя цель состоит в том, чтобы диапазон элементов предоставил как можно больше выходных данных, но без дублированных выходных данных. Код, который я предоставил, представляет собой небольшой пример того, над чем я работаю. Что касается моего большого набора данных, я заметил, что дубликаты выводов мешают файлу 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}')

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

0
Doug Morrow 2 Июл 2019 в 10:50

4 ответа

Лучший ответ

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

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

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
vencaslac 2 Июл 2019 в 08:17

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

  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')]
  1. Выберите элементы из permutations, выбрав произвольно индекс и распечатав его.
 num = int(random.random() * total_elements)
 print '{} {} {}'.format(permutations[num][0], permutations[num][1], permutations[num][2])
  1. Далее мы удаляем элемент из списка 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
Achint Sharma 2 Июл 2019 в 08:33

Вы можете использовать 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
Greeser 2 Июл 2019 в 08:13

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

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

import random

random.shuffle(lst)

while lst:
    element = x.pop()
0
Afik Friedberg 2 Июл 2019 в 08:00