def fill2_line1():
    x2 = random.choice(list(twoSyllValues.items()))
    line1.append(x2)

magicList = ([x[1] for x in line1])
            
if 1 in magicList:
    fill2_line1()
    fill2_line1()
    complete_line = line1[0][0] + " " + line1[1][0] + " " + 
    line1[2][0]
    print(complete_line)

Это та часть, о которой идет речь - вся программа составляет более 150 строк. Он отлично работает как есть, но иногда у меня дублируются слова. Чтобы уточнить код, я хочу убедиться, что ключ в первом случайном выборе кортежа не дублируется в следующих двух выбранных кортежах В этом списке, line1. Единственный способ, который я могу придумать, - это создать еще один словарь после выбора первого слова, а затем исключить этот ключ, пару значений из нового словаря и затем выполнить следующие два вызова random.choice. Я чувствую, что должен быть способ попроще, но у меня еще нет опыта.

2
danno 4 Сен 2020 в 07:48

1 ответ

Лучший ответ

Я могу придумать три способа решения проблемы, с которой вы столкнулись. Я напишу образец кода, на который вы можете сослаться, поскольку я не знаю весь ваш код.

  1. Удалите ключ перед вторыми вызовами random.choice и добавьте их обратно, если они вам понадобятся. Это несколько похоже на создание другого словаря, но более эффективно.
def fill2_line1():
    x2 = random.choice(list(twoSyllValues.items()))
    line1.append(x2)
    return x2

magicList = ([x[1] for x in line1])
            
if 1 in magicList:
    deleted_list = []
    # run first random.choice
    deleted_item = fill2_line1()
    deleted_list.append(deleted_item)
    del twoSyllValues[deleted_item[0]]
    # run second random.choice
    deleted_item = fill2_line1()
    deleted_list.append(deleted_item)
    del twoSyllValues[deleted_item[0]]
    complete_line = line1[0][0] + " " + line1[1][0] + " " 
                    + line1[2][0]
    print(complete_line)
    # add the deleted items back in after work is done
    for k, v in deleted_list:
        twoSyllValues[k] = v
  1. Запускайте random.choice, пока не останется повторяющихся элементов.
def fill2_line1(deleted_set):
    x2 = random.choice(list(twoSyllValues.items()))
    while x2 not in deleted_set:
        x2 = random.choice(list(twoSyllValues.items()))
    line1.append(x2)
    deleted_set.add(x2)

magicList = ([x[1] for x in line1])
            
if 1 in magicList:
    deleted_set = set([])
    fill2_line1(deleted_set)
    fill2_line1(deleted_set)
    complete_line = line1[0][0] + " " + line1[1][0] + " " 
                    + line1[2][0]
    print(complete_line)
  1. Сохраните другой список только для случайного выбора.
def fill2_line1(items_list):
    x2 = random.choice(items_list)
    line1.append(x2)
    items_list.remove(x2)

magicList = ([x[1] for x in line1])
            
if 1 in magicList:
    items_list = list(twoSyllValues.items())
    fill2_line1(items_list)
    fill2_line1(items_list)
    complete_line = line1[0][0] + " " + line1[1][0] + " " 
                    + line1[2][0]
    print(complete_line)

Надеюсь, мой ответ дал вам несколько идей!

1
noninertialframe 4 Сен 2020 в 05:44