尝试练习我的列表理解,但此时我的代码看起来有点(太长)每行长度理解:
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'不支持的操作数类型和'列出'
请指教!
答案 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
但这不是一个好习惯!