我有一个将数组作为输入的函数。如何修改它以使用变量参数和数组。例如,我希望arrSum(1,2,3) == arrSum([1,2,3])
返回True
,即两者都应返回6
我已经问过this same question for JavaScript但是当我尝试在Python中实现相同的技术时,我会遇到完全意外的错误。
这是我根据目前对python的了解而尝试做的事情。
def arrSum(*args):
listOfArgs = []
listOfArgs.extend([*list(args)])
return sum(listOfArgs)
它适用于arrSum(1,2,3)
,但会为arrSum([1,2,3])
返回错误
arrSum(1,2,3)
返回6
,这是预期的输出。
但是`arrSum([1,2,3])会返回以下错误:
Traceback (most recent call last):
File "python", line 7, in <module>
File "python", line 4, in arrSum
TypeError: unsupported operand type(s) for +: 'int' and 'list'
在print(listOfArgs)
打return sum(listOfArgs)
之前执行[[1,2,3]]
。
REPL.it链接
答案 0 :(得分:2)
Javascript spread运算符处理一个值数组和一个包含另一个值完全相同的数组的数组:
[].concat(...[1, 2])
Array [ 1, 2 ]
[].concat(...[[1, 2]])
Array [ 1, 2 ]
它基本上使多个数组变平:
[].concat(...[[1, 2], [3, 4]])
Array [ 1, 2, 3, 4 ]
but only by one layer:
[].concat(...[[[1, 2]]])
[[ 1, 2 ]]
Python更精确。没有隐式展平,您必须显式:
def arrSum(*args):
if len(args) == 1 and isinstance(args[0], list):
args = args[0]
return sum(args)
如果您想要复制多个列表的支持(arrSum([1, 2], [3, 4])
,我会重复使用Flatten (an irregular) list of lists最高答案:
import collections
def flatten(l):
for el in l:
if isinstance(el, collections.Iterable) and not isinstance(el, (str, bytes)):
yield from flatten(el)
else:
yield el
def arrSum(*args):
return sum(flatten(args))
答案 1 :(得分:0)
您需要检查是否有列表或int。 :)
此处,此函数假定您只接收整数和整数列表。
def arrSum(*args):
ret = 0
total = 0
for elem in args:
# If you have a list, adds the sum of the list, else, simply add the int.
if isinstance(elem, list):
total += len(elem)
ret += sum(elem)
else
total += 1
ret += elem
average = ret / total
return ret, average
print arrSum([1, 2, 3])
print arrSum(1, 2, 3)
# both outputs : 6
答案 2 :(得分:0)
从Martijin的回答中获取灵感后,我想出了一个自己的解决方案(甚至想出了一个python的扩展函数): -
{'key1': {'subkey1': 2, 'subkey2': 7, 'subkey3': 5}}