没有最低和最高列表整数的列表总和(python)

时间:2016-09-21 20:16:33

标签: python if-statement list-comprehension

尝试练习我的列表理解,但此时我的代码看起来有点(太长)每行长度理解:

def sum_array(arr):
    return 0 if arr == None else sum(sorted(arr)[1:-1] for x in range(len(arr or [])-2)) 

目标是计算整数之和减去最小值和最大值。如果array为空,None,或者如果只存在1个元素,则该函数应返回0.

我收到以下

  

TypeError:+:' int'不支持的操作数类型和'列出'

请指教!

6 个答案:

答案 0 :(得分:2)

  

美丽胜过丑陋。

def sum_array(arr):
    if arr is None or len(arr) <= 1:
         return 0
    else:
         return sum(sorted(arr)[1:-1])

答案 1 :(得分:1)

不确定为什么需要for中的sum。似乎x未在任何地方使用。这可以简化为:

def sum_array(arr):
    return 0 if not arr else sum(sorted(arr)[1:-1])

答案 2 :(得分:0)

了解最大值和最小值的最简单方法是对列表进行排序。

arr = sorted(arr)

arr [0]是最小的,arr [-1]是最大的

所以

if arr is None:
    return 0
else:
    return sum(sorted(arr)[1:-1])

答案 3 :(得分:0)

您的代码几乎正确,但最后一个逻辑不适用。

Sport
- Baseball
- Basketball
Web
- IT
- Trends
Politics
- Party 1
- Party 2

答案 4 :(得分:0)

这是符合您要求的版本:

def sum_array(arr):
    return (None if len(arr) <= 1 else 0) if not arr else sum(sorted(arr)[1:-1])

cases = [[j + 1 for j in range(i)] for i in range(5)]

for c in cases:
    print(c, sum_array(c))

# Requirements: Objective is to calculate sum of integers minus the min and
# max. If array is empty, None, or if only 1 element exists, the function
# should return 0.
# [] None
# [1] 0
# [1, 2] 0
# [1, 2, 3] 2
# [1, 2, 3, 4] 5

答案 5 :(得分:0)

您获得TypeError,因为您尝试sum列表。让我稍微改变你的代码:

 In[1]: arr = [1, 2, 3, 4, 5]
        [sorted(arr)[1:-1] for x in range(len(arr))]

Out[1]: [[2, 3, 4], [2, 3, 4], [2, 3, 4], [2, 3, 4], [2, 3, 4]]

我在列表理解上更改了您的生成器表达式以显示该想法。实际上,您在每个隐式next调用上生成一个列表。此错误的进一步后果是:

 In[2]: sum([[1],[2],[3]])       # will raise TypeError
Out[2]: TypeError: unsupported operand type(s) for +: 'int' and 'list'

 In[3]: sum([[1],[2],[3]], [])   # if you specify start, it will work
Out[3]: [1, 2, 3]

sum函数的签名是sum(iterable[, start])。从左到右汇总开始和可迭代项并返回总计。 start默认为0. iterable的项通常是数字,起始值不允许是字符串。在第一种情况下,您确实尝试对[1] + [2] + [3] + 0求和,并且因为+list之间的int未定义,这就是您获得TypeError的原因。在第二种情况[1] + [2] + [3] + []中,此操作连接列表并且完全有效。

如果您想查看代码和反馈,请查看Stackexchange的CodeReview网站。

如果您喜欢 one-liners ,可以试试这个。这里还假设有效数组始终是<class list>的实例:

 In[4]: sum_array = lambda arr: sum(sorted(arr)[1:-1]) if isinstance(arr, list) else 0
        sum_array([4, 3, 8, 1, 7, 12, 5, 9])
Out[4]: 36

但这不是一个好习惯!