Python - если условие для переменной True, выполнить функцию, назначающую новую переменную, пока False - PullRequest
0 голосов
/ 09 ноября 2018

Я никогда не сталкивался с подобной ситуацией в цикле Python for.

У меня есть словарь Names (key) и Regions (value). Я хочу сопоставить каждое имя с двумя другими именами. Совпадающее имя не может быть самим собой, и обращение элементов не является действительным совпадением (1,2) = (2,1). Я не хочу, чтобы люди из одного региона были сопоставлены (если это не становится невозможным).

dict = {
    "Tom":"Canada",
    "Jerry":"USA",
    "Peter":"USA",
    "Pan":"Canada",
    "Edgar":"France"
    }

желаемый возможный вывод: [('Tom','Jerry'),('Tom','Peter'),('Jerry','Pan'),('Pan','Peter'),('Edgar','Peter'),('Edgar','Jerry')]

Каждый появляется дважды, но Джерри и Питер появляются больше, чтобы у Эдгара было 2 матча с Именами из другого региона (Джерри и Питер должны быть выбраны здесь случайно) Count: Tom: 2, Jerry: 3, Peter: 3, Pan: 2, Edgar: 2

Мой подход состоит в том, чтобы преобразовать имена в список, перемешать их, а затем создать пары кортежей, используя zip в пользовательской функции. После завершения функции. Я использую for, чтобы проверить наличие пар из одной и той же области, если существует одна и та же область спаривания, а затем повторно запустить пользовательскую функцию. По какой-то причине, когда я печатаю результаты, я все еще вижу пары между одними и теми же регионами. Что мне здесь не хватает?

    import random
    names=list(dict.keys())
    def pairing(x):
        random.shuffle(x)
        #each person is tupled twice, once with the neighbor on each side
        pairs = list(zip(x, x[1:]+x[:1]))
        return pairs

    pairs=pairing(names) #assigns variable from function to 'pairs'

    for matchup in pairs:
        if dict[matchup[0]]==dict[matchup[1]]:    
            break
            pairing(names)

    pairs=pairing(names)
    for matchup in pairs:
        print(matchup[0] ,dict[matchup[0]] , matchup[1] , dict[matchup[1]])

Просто глядя на это, что-то явно сломано в цикле for, пожалуйста, помогите!

Я пробовал while вместо if в цикле for, но это не сработало.

1 Ответ

0 голосов
/ 10 ноября 2018
from itertools import combinations
import pandas as pd
import random

dict={'your dictionary'}

#create function to pair names together
def pairing(x):
    random.shuffle(x)
    #each person is tupled twice, once with the neighbor on each side
    pairs = list(zip(x, x[1:]+x[:1]))
    for matchup in pairs:
        if dict[matchup[0]]==dict[matchup[1]]: #if someone's gym matches their opponent's gym in dictionary, re-run this function
            return pairing(x) 
    return pairs

pairs=pairing(names)
for matchup in pairs:
    print(matchup[0] ,dict[matchup[0]] , matchup[1] , dict[matchup[1]])

Хитрость заключается в return pairing(x) внутри пользовательской функции. Это вернет новые пары, если какие-либо элементы в кортеже имеют одинаковое значение в словаре. Если внутри if statement вы перейдете pairing(x), а затем return pair, он вернет исходный список кортежей, содержащий дубликаты.

...