Перебирать список кортежей и распаковывать элементы каждого кортежа

#python #iterable-unpacking

#python #итерируемый-распаковка

Вопрос:

У меня есть этот список кортежей с двумя значениями

 stake_odds=[(0, 1), (0, 2), (0, 5), (0, 10), (2, 1), (2, 2), **(2, 5)**, (2, 10), (5, 1), (5, 2), (5, 5), (5, 10), (10, 1), (10, 2), (10, 5), (10, 10)]
 

У меня есть следующая функция, в которой я хочу поместить кортеж в объектный метод, где он вычисляет произведение (или минус произведение в зависимости от экземпляра) двух чисел в кортеже. Если результат положительный, я хочу добавить используемый кортеж в другой список, pos_cases .

 def function():
    pos_cases=[]
    x,y=stake_odds[9]
    b1=bet1.payout(x,y)
    if b1 > 0:
        return b1, "b is greater than zero!"
        pos_cases.append(stake_odds[9])
        print(pos_cases)

print(function())
 

Как вы можете видеть ниже, я должен распаковать кортеж в две переменные перед вычислением. Я могу сделать это, указав элемент списка ( stake_odds[9] ) , однако я ищу способ обобщить и перебирать список ( stake_odds[i] ), а не переходить один за другим.

Список в этом примере будет сокращен до следующего:

 pos_cases =[(2, 1), (2, 2), (2, 5), (2, 10), (5, 1), (5, 2), (5, 5), (5, 10), (10, 1), (10, 2), (10, 5), (10, 10)]
 

Как я мог это сделать? Единственное, что я могу придумать, это какой-то вложенный цикл for, например:

 for i in stake_odds: 
    for x,y in i:
        return(x,y)
 

Но это приводит к error >TypeError: cannot unpack non-iterable int object> .

Комментарии:

1. Ваш последний пример извлекает целые числа из двухэлементного кортежа. i получает один кортеж из stake_odds на каждой итерации. Ваш следующий цикл извлекает два элемента по i одному (как два отдельных целых числа), отсюда и ошибка. измените for x,y in i: на simply x,y=i , и он будет распакован, как и ожидалось.

2. спасибо, сработало! есть какой-нибудь способ просто распечатать окончательный список, как только он будет готов? В настоящее время я получаю распечатку для каждого добавления … например [(2, 1)] , затем [(2, 1), (2, 2)] и так далее

3. Я не вижу код, который вы сейчас запускаете, но вам, вероятно, нужно отменить строку печати.

4. да, unindent сработал, еще раз спасибо. Я изменил оператор print на return, чтобы удалить ‘none’ при получении вывода функции

Ответ №1:

Разве это не работает?:

 def function():
    pos_cases=[]
    for x,y in stake_odds:
        b1=bet1.payout(x,y)
        if b1 > 0:
            return b1, "b is greater than zero!"
            pos_cases.append((x,y))
    return pos_cases

print(function())