鱼C论坛

 找回密码
 立即注册
查看: 536|回复: 14

[已解决]关于python数组计算问题

[复制链接]
发表于 2020-4-2 16:29:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 高义校长 于 2020-4-2 16:35 编辑

有下面3个列表:

a=[1, 2, 3, 4, 5]
b=[1, 2, 3]
c=[1, 2, 3, 4, 5, [1, 2, 3]]

请问用代码如何写才能达到下面的结果。

(1)列表c所有元素求和,得到一个整数21。
(2)列表a和b对应元素相加,得到[2,4,6,4,5]这样一个列表
最佳答案
2020-4-2 16:36:46
高义校长 发表于 2020-4-2 16:31
不好意思,发太快,就是想问如何实现。

问题1
  1. def func1(array):
  2.         sum=0
  3.         for i in array:
  4.                 if type(i) is list:
  5.                         sum+=func1(i)
  6.                 else:
  7.                         sum+=i
  8.         return sum
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-2 16:30:22 | 显示全部楼层
问题呢???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 16:31:44 | 显示全部楼层

不好意思,发太快,就是想问如何实现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 16:36:46 | 显示全部楼层    本楼为最佳答案   
高义校长 发表于 2020-4-2 16:31
不好意思,发太快,就是想问如何实现。

问题1
  1. def func1(array):
  2.         sum=0
  3.         for i in array:
  4.                 if type(i) is list:
  5.                         sum+=func1(i)
  6.                 else:
  7.                         sum+=i
  8.         return sum
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 16:39:20 | 显示全部楼层
高义校长 发表于 2020-4-2 16:31
不好意思,发太快,就是想问如何实现。

问题2
  1. from itertools import zip_longest

  2. def func2(*arrays):
  3.         return [sum(i) for i in zip_longest(*arrays,fillvalue=0)]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 16:46:14 | 显示全部楼层

非常感谢您。我是一个新手,以前会一点简单的VBA。
您这个是引入新的模块。
请教一下,python是否有数组下标类似的概念:
如:cr(i)=ar(i)+br(i)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 16:47:42 | 显示全部楼层
高义校长 发表于 2020-4-2 16:46
非常感谢您。我是一个新手,以前会一点简单的VBA。
您这个是引入新的模块。
请教一下,python是否有数 ...

有,比如有这样一个列表
  1. a=[1,2,3,4,5]
复制代码
  1. a[4]
复制代码
就可以访问到第5个值,也就是
  1. 5
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 16:50:37 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-2 16:47
有,比如有这样一个列表,就可以访问到第5个值,也就是

那第二个问题是不是可以直接相加。但我这边就提示索引越界了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 16:53:31 | 显示全部楼层
高义校长 发表于 2020-4-2 16:50
那第二个问题是不是可以直接相加。但我这边就提示索引越界了。

不能,两个数组不一样长,直接加肯定越界

给你一个不导入模块的版本
  1. def func2(*its):
  2.     its=map(iter,its)
  3.     temp=[]

  4.     while True:
  5.         sum=0
  6.         flag=True

  7.         for i in its:
  8.             try:
  9.                 sum+=next(i)
  10.                 flag=False

  11.             except StopIteration:
  12.                 pass

  13.         if flag:
  14.             return temp
  15.         
  16.         temp.append(sum)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 16:55:50 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-2 16:53
不能,两个数组不一样长,直接加肯定越界

给你一个不导入模块的版本

感谢感谢,我还得消化一下。如果出现了3维或以上,是不是比较麻烦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 16:59:21 | 显示全部楼层
高义校长 发表于 2020-4-2 16:55
感谢感谢,我还得消化一下。如果出现了3维或以上,是不是比较麻烦。

递归 就是应对这种问题的,感兴趣可以搜索一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 20:35:44 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-2 16:59
递归 就是应对这种问题的,感兴趣可以搜索一下

前面那个单纯的一维列表我研究出来了,但二级及以上我就研究不清楚了,求助。
第一个问题:
数组所有元素求和:
a=[1, 2, 3, 4, 5, 1, 2, 3, 1, 2, 3, [1, 2, [1,2,3,5]]]
def sm(x):
    return sum(i in x if isinstance(i,int) else sm(i) for i in x)
print(sm(a))
第二个问题就不行了,为什么我第二个问题会报错呢。
a=[[1,2,3,4],[1,2],[1,2,3],5]
b=[[1,2,3],[1,2,3],[1,2],5,6]
from itertools import zip_longest
class Arsum:
    def __init__(self,m,n):
        self.m=m
        self.n=n
    def getlst(self):
        return [sum(x) for x in zip_longest(self.m,self.n,fillvalue=0)]
c=Arsum(a,b)
c.getlst()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 20:48:20 | 显示全部楼层
有没有大佬再帮忙看一下,怎么计算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-4 22:51:49 | 显示全部楼层
高义校长 发表于 2020-4-4 20:35
前面那个单纯的一维列表我研究出来了,但二级及以上我就研究不清楚了,求助。
第一个问题:
数组所有元 ...

不报错就奇怪了,sum的列表里既有list还有int
还有,没事用什么类
  1. from itertools import zip_longest

  2. def flatten(iterable,/):
  3.     for element in iterable:
  4.         if hasattr(element,'__iter__'):
  5.             yield from flatten(element)
  6.         
  7.         else:
  8.             yield element

  9. def Arsum(*v):
  10.     return [sum(i) for i in zip_longest(*map(flatten,v),fillvalue=0)]

  11. a=[[1,2,3,4],[1,2],[1,2,3],5]
  12. b=[[1,2,3],[1,2,3],[1,2],5,6]

  13. print(Arsum(a,b))
复制代码
PS:提问新内容记得开新帖,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 23:03:48 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-4 22:51
不报错就奇怪了,sum的列表里既有list还有int
还有,没事用什么类PS:提问新内容记得开新帖,

非常感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 07:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表