#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:
на simplyx,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())