【问题标题】:Sum of list without lowest and highest list integers (python)没有最低和最高列表整数的列表总和(python)
【发布时间】:2016-09-21 20:16:32
【问题描述】:

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

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

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

我收到以下内容

TypeError:+ 的不支持的操作数类型:“int”和“list”

请指教!

【问题讨论】:

  • 我没有看到任何列表理解..
  • 首先,不要与None进行相等比较;使用身份。
  • 单线很酷。但说真的,如果你自己的代码看不懂,可以考虑使用多行代码。
  • 我不明白你为什么要这么做for x in range(len(arr or [])-2)
  • 担心arrNone 只是分散注意力。假设arr 至少是您可以添加的内容的有效列表,然后从那里开始。毕竟,您并没有检查 arr 是否不包含字符串。

标签: python if-statement list-comprehension


【解决方案1】:

美胜于丑。

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

【讨论】:

  • if arr is None or len(arr) &lt;= 1: 只能写成if not arr
  • if arr 在任何 falsy 值上都会失败。最好是明确的。
  • 什么意思?
  • 具有单个项目的数组不是虚假的。虽然sorted 处理了这个问题,但我宁愿明确
  • arr[1:-1] 返回[],总和为0,但又一次“显式优于隐式”
【解决方案2】:

不知道为什么需要sum 中的forx 似乎没有在任何地方使用。这可以简化为:

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

【讨论】:

  • 这非常有用且有效,感谢您的快速回复。
【解决方案3】:

知道最大值和最小值在哪里的最简单方法是对列表进行排序。

arr = sorted(arr)

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

所以

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

【讨论】:

  • 如果你只需要一个元素也返回0
  • 我建议您尝试仅使用一个元素运行上述代码。你可能会感到惊讶
  • 好吧,你赢了,但是Zen of Python 说“显式优于隐式。”。所以可读性也很重要。
  • @vishes_shell - 要检查一个元素,我是否会将其更改为“如果 arr 为 None 且 arr == 1”?
  • 要检查一个集合有多少元素,使用len函数:len(arr) &lt;= 1 len是长度的缩写
【解决方案4】:

你得到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 和一个可迭代对象的 相加并返回总数。 start 默认为 0。iterable 的项一般为数字,起始值不允许为字符串。在第一种情况下,您确实尝试对[1] + [2] + [3] + 0 求和,并且因为未定义listint 之间的+,这就是您得到TypeError 的原因。在第二种情况下[1] + [2] + [3] + [] 这个操作连接列表并且完全有效。

如果您想查看您的代码并获得一些反馈,请查看 Stackexchange 的 CodeReview 网站。

如果你喜欢 one-liners,你可以试试这个。这里还假设一个有效的数组总是&lt;class list&gt; 的实例:

 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

但这不是一个好习惯!

【讨论】:

    【解决方案5】:

    这是满足您要求的版本:

    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
    

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多