Tuple в списке содержит меньше элементов, чем требуется для Python 3 - PullRequest
0 голосов
/ 06 июня 2018

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

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

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

def summary(xs):
    for x,y,z in xs:
        print( x*x + y*y + z*z)


xs =[(2,3,4), (2,-3,4), (1,2,3)]

summary(xs)

Однако, если я использую список с меньшим количеством кортежейчем определение функции, я получаю сообщение об ошибке: ValueError: недостаточно значений для распаковки (ожидается 3, получено 0):

xs =[(2,3,4), (), (1,2,3)]

Я хотел бы знать, как создать функцию, которая будет принимать кортеж Iпоказано до () - без кортежей, и функция будет возвращать 0. Я пробовал несколько способов, как решить эту проблему уже 2 дня, а также поиск в Google, но мне кажется, что я либо что-то упустил, или яне знает о функции, которую я мог бы использовать.Спасибо всем за помощь.

Ответы [ 5 ]

0 голосов
/ 06 июня 2018

Часто бывает полезно разделить ваш алгоритм на функции, которые просто выполняют одну функцию.В этом случае функция для суммирования квадратов списка значений и функция для их печати.Очень полезно сохранять значимость имен переменных.В этом случае ваш xs является списком списков, поэтому может быть лучше назван xss

import math

def sum_of_squares(xs):
    return sum(map(math.sqr, xs))

def summary(xss):
    for xs in xss:
        print sum_of_squares(xs)

xss = [(2,3,4), (), (1,2,3)]

summary(xss)

или

map(print, sum(map(math.sqr, (x for x in xs))))
0 голосов
/ 06 июня 2018

Вы должны использовать условие "len> 0".Этот код должен работать для любого списка или длины кортежа:

def summary(xs):
    for tup in xs:
        prod = [a*a for a in tup if len(tup)>0]
        print(sum(prod))

Обратите внимание, что я определил список «prod», чтобы использовать «sum», чтобы он не вычислялся сложным образом.Он заменяет ваш "x * x + y * y + z * z" и работает для любой длины кортежа.

0 голосов
/ 06 июня 2018

Ну, проблема в том, что у вас недостаточно индексов во внутреннем кортеже для распаковки в три переменные.Самый простой способ обойти это - вручную распаковать после , проверив, достаточно ли у вас переменных, например:

def summary(xs):
    for values in xs:
        if values and len(values) == 3:
            x, y, z = values  # or don't unpack, refer to them by index, i.e. v[0], v[1]...
            print(x*x + y*y + z*z)
        else:
            print(0)

Или использовать блок try..except:

def summary(xs):
    for values in xs:
        try:
            x, y, z = values  # or don't unpack, refer to them by index, i.e. v[0], v[1]...
            print(x*x + y*y + z*z)
        except ValueError:  # check for IndexError if not unpacking
            print(0)
0 голосов
/ 06 июня 2018

Одним из способов является перебор значений кортежей, это также способ решения этой проблемы почти на каждом языке программирования:

def summary(xs):
    for item in xs:
        s = 0
        for value in item:
            s += value**2
        print(s)

Или использование списка:

def summary(xs):
   for item in xs:
       result = sum([x**2 for x in item])
       print(result)

также обратите внимание, что sum([]) вернет 0 для пустой итерации.

0 голосов
/ 06 июня 2018

Одним из способов является использование try / except.В приведенном ниже примере мы используем генератор и ловим случаи, когда распаковка завершается неудачно с ValueError и выдает 0.

Пока вы учитесь, я настоятельно рекомендую вам попрактиковаться в написании функций, которые скорее return или yieldчем использовать их для print значений.

def summary(xs):
    for item in xs:
        try:
            yield sum(i**2 for i in item)
        except ValueError:
            yield 0

xs = [(2,3,4), (), (1,2,3)]

res = list(summary(xs))

print(res)

[29, 0, 14]

Или фактически использовать генератор ленивым образом:

for i in summary(xs):
    print(i)

29
0
14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...