Как выбрать случайный элемент из списка при рассмотрении двух списков?

Извините, я не мог придумать лучшего названия. Моя проблема в том, что у меня есть два списка, и я хочу случайным образом выбрать элемент из первого списка и сопоставить его с элементом из второго списка, но индексы этих элементов не могут быть одинаковыми (li1 [3] не может быть сопоставлен с li2 [3] ), а также после выбора предмета его необходимо удалить из списка. Я пробовал этот код, но он не выполняет свою работу. Спасибо за любую помощь.

from random import choice

teams1 = ["brazil", "croatia", "england", "italy", "mexico", "cameroon", "ivory coast", "japan"]
teams2 = ["spain", "germany", "belgium", "holland", "argentina", "portugal", "france", "usa"]


counter = 3
counter2 = 8 
while counter != 0:
    a = choice(range(1,counter2))
    a1 = teams1[a]
    b = choice(range(1,counter2))
    b1 = teams2[b]
    print(teams1[0], b1)
    print(teams2[0], a1)
    del teams1[a]
    del teams2[b]
    del teams1[0]
    del teams2[0]
    counter -= 1
    counter2 -= 2

print(teams1[0], teams2[0])

person sabio    schedule 22.04.2014    source источник
comment
Я не понимаю, что вы имеете в виду, когда индексы выбранных предметов не могут совпадать. Являются ли они указателями после того, что выбранные элементы были удалены из списков, или указателями в исходных списках?   -  person Taro Sato    schedule 22.04.2014
comment
Извините, я сначала не понял это прямо. В основном дело в том, например, что Италия никогда не может быть объединена с Голландией, Хорватия никогда не может быть сопоставлена ​​с Германией и т. Д. Даже после того, как исходный список был изменен.   -  person sabio    schedule 22.04.2014
comment
Я думаю, что это не может быть сделано полностью случайным образом, так как иногда команды выбираются в таком порядке, что последние оставшиеся в каждом списке - это матч, которого нужно избегать. Когда это произойдет, вам придется перезапустить рисунок с самого начала. Это то, что ты хочешь сделать? У меня каким-то образом возникает ощущение, что способ построения совпадений, как описано, не совсем то, что вам нужно делать, но я не знаю реальной проблемы, которую вы пытаетесь решить.   -  person Taro Sato    schedule 22.04.2014
comment
Команды продвигаются из восьми разных групп. Из каждой группы выходят по две команды. Один с места номер один, два с места номер два. Скажем, первая группа продвигает 1. Бразилию и 2. Испанию, вторая группа продвигает 1. Хорватию и 2. Германию и т. Д. Бразилия не может встретиться с Испанией, поскольку они уже были вместе в группе, и она не может встретиться с другие команды, которые были повышены с места номер один. Это то, что я пытаюсь понять здесь.   -  person sabio    schedule 22.04.2014


Ответы (3)


Вы можете сделать это с помощью random.randrange!

import random

teams1 = ["brazil", "croatia", "england", "italy", "mexico", "cameroon", "ivory coast", "japan"]
teams2 = ["spain", "germany", "belgium", "holland", "argentina", "portugal", "france", "usa"]

t1 = random.randrange(0, len(teams1))
t2 = random.randrange(0, len(teams2))

while t2 == t1:
    t2 = random.randrange(0, len(teams2))

rand_choice1 = teams1.pop(t1)
rand_choice2 = teams1.pop(t2)

Цикл while предотвращает совпадение двух индексов, а встроенный метод .pop() списка удаляет команды, которые мы выбираем из списка.

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

person Luigi    schedule 22.04.2014

Ваша программа правильная. За исключением того, что ваша программа завершает работу, когда в любом из списков все еще есть значения. Это потому, что ваш counter достигает 0 и условие:

while counter != 0:

больше не держит.

Вы можете изменить это условие, чтобы проверить, нет ли больше элементов в любом из списков, используя:

while len(teams1) and len(teams2):

or :

while counter > -1:

и избавьтесь от последней строки:

print(teams1[0], teams2[0])

И ваша программа работает как положено.

person shaktimaan    schedule 22.04.2014

Я не удивлюсь, если есть более элегантный способ построения парных комбинаций, но он, похоже, делает то, что было разъяснено в комментариях к вопросу:

#/usr/bin/env python2.7
from random import shuffle

def main():

    teams1 = ["brazil", "croatia", "england", "italy",
              "mexico", "cameroon", "ivory coast", "japan"]
    teams2 = ["spain", "germany", "belgium", "holland",
              "argentina", "portugal", "france", "usa"]

    excluded_pairs = dict(zip(teams1, teams2))
    shuffle(teams1) # not really needed
    shuffle(teams2)

    while len(teams1):
        t1 = teams1.pop()
        if len(teams1) > 1:
            if teams2[-1] != excluded_pairs[t1]:
                t2 = teams2.pop(-1)
            else:
                t2 = teams2.pop(-2)
        elif len(teams1) == 0:
            t2 = teams2.pop(-1)
        elif len(teams1) == 1:
            if (teams2[-1] != excluded_pairs[t1]
                and teams2[-2] != excluded_pairs[teams1[0]]):
                t2 = teams2.pop(-1)
            else:
                t2 = teams2.pop(-2)

        print '{} vs. {}'.format(t1, t2)

    print len(teams1)
    print len(teams2)

if __name__ == '__main__':
    main()
person Taro Sato    schedule 22.04.2014