如何简化这个函数?

3
def average(tup):
  """ ugiufh """
   total = ((int(tup[0]) + int(tup[1]) + int(tup[2]))/3,
            (int(tup[0]) + int(tup[1]) + int(tup[2]))/3,
            (int(tup[0]) + int(tup[1]) + int(tup[2]))/3)
   return total

我正在编写一个函数,用于计算元组中三个元素的平均值,这意味着如果原始元组=(1, 2, 3),则给出元组=(2, 2, 2)。
我的问题是是否有任何方法可以简化我的代码并获得相同的答案?如果可以,如何简化?
谢谢

8
删掉 """ ugiufh """ - 少一行。 :) - James
你确定你想在这里进行整数除法吗?只是一个问题。 - Justin Peel
1
不要删除它,但在docstring中描述其功能。 - joaquin
5个回答

5

如果您确定需要整数除法,可以使用

def average(tup):
    n = len(tup)
    return (sum(int(x) for x in tup) / n,) * n

出于好奇,为什么不一步到位,将其改为 return (sum(int(x) for x in tup) / len(tup))*n - James
@James:因为你的代码(a)没有定义n,(b)也没有返回一个元组。 - Sven Marnach
我不明白为什么你不能像我的答案一样,只是采用return (sum(tup) / len(tup),) * len(tup)。为什么要使用生成器? - Benjamin
@Benjamin:因为我想要复现原帖中的函数行为。你的函数做了其他事情,可能甚至是原帖作者想要的,但不是她所要求的。 - Sven Marnach
@Sven:我不明白我的解决方案与原帖的代码或你的代码有什么不同? - Benjamin
显示剩余2条评论

1

有方法可以压缩您列出的代码,但您真正应该努力的是使代码更易读。

def average(a):
    """Return a tuple where every element of ``a`` is replaced by the average of the values of ``a``."""
    length = len(a)
    average = sum(a) / length
    return (average,) * length # A 1-tuple containing the average, repeated length times

这样做的额外好处是能够接受任何长度的元组作为输入。

在此版本的代码中进行的一个更改是,元组的元素不再首先强制转换为整数。除非有某些特殊原因需要这样做,否则您应该将该逻辑分离到单独的代码块中。

data = (1, '2', 3.0)
normalised_data = (int(x) for x in data) # A generator expression that yields integer-coerced elements of data
result = average(normalised_data)

当然,如果你坚持要一个简洁的答案,Sven的答案在功能上与我的答案等同。

在Python 2.x中,如果传入的元组只包含整数,则该版本将使用整数除法,但是一旦包含一个浮点数,它将计算实际平均值。 OP的版本(以及我的版本)始终使用整数除法。 可能最明智的版本可能是始终使用浮点除法。 - Sven Marnach

0
def average(tup):
    def mean(t):
        return sum(t, .0) / len(t)
    return (mean(tup),) * len(tup)

一行代码:

def average(tup): return ((lambda t: sum(t, .0) / len(t))(tup),) * len(tup)

或者

average = lambda tup: ((lambda t: sum(t, .0) / len(t))(tup),) * len(tup)

但是第一段代码比这些更好。


0
def average(tup):
    return (sum(tup) / len(tup),) * len(tup)

0
def average(tup):
    """ ugiufh """
    el = sum( map(int,tup) )/3
    return (el,el,el)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接