Python3.6:当列表中的一个值发生变化时,是否在另一个列表中找到这些值的总和?
当列表A中的值更改时,例如从1更改为3。 查找列表B中一组值的总和,例如(5,9,3)的总和。 列表A和B的大小相同 在列表A中=['1'、'1'、'1'、'3'、'3'、'4']Python3.6:当列表中的一个值发生变化时,是否在另一个列表中找到这些值的总和?,python,list,sum,Python,List,Sum,当列表A中的值更改时,例如从1更改为3。 查找列表B中一组值的总和,例如(5,9,3)的总和。 列表A和B的大小相同 在列表A中=['1'、'1'、'1'、'3'、'3'、'4'] 搜索-1)其中值从1变为3,2)其中值从3变为4 在列表B中=['5'、'9'、'3'、'4'、'8'、'1'] 结果-1)仅求和5+9+3,2)仅求和4+8 有办法做到这一点吗? 因为我想不出一个合乎逻辑的方法来解决这个问题 我的代码开始: A = ['1','1','1','3','3','4'] B = ['
搜索-1)其中值从1变为3,2)其中值从3变为4 在列表B中=['5'、'9'、'3'、'4'、'8'、'1']
结果-1)仅求和5+9+3,2)仅求和4+8 有办法做到这一点吗? 因为我想不出一个合乎逻辑的方法来解决这个问题 我的代码开始:
A = ['1','1','1','3','3','4']
B = ['5','9','3','4','8','1']
这将检查A的每个相邻值,看看它们是否相同,但我不知道如何将其与列表B的值联系起来。您需要做的是思考一个更简单的问题: 假设你有:
A = ['1','1','1','3','3','4']
B = ['5','9','3','4','8','1']
C=[int(value) for value in A]
print(C)
for i in C:
if C[:-i] == C[:i]:
我们怎样才能检测到A发生了变化
我们需要保留一份a
的副本,以便在我们认为发生了变化时进行比较:
A = 1
B = 5
现在,您似乎已经用类似的想法更新了您的问题:
A = 1
B = 5
old_A = A # take a copy
# Detect a change:
if A != old_A:
result = B
现在我们必须检测变化:
A = ['1','1','1','3','3','4']
B = ['5','9','3','4','8','1']
C = A[:] # take a copy
现在我们知道哪些数字已更改,我们可以从B
中选择相应的项目:
# suppose that A is now ['3','3','3','3','3','4']
# while C is still ['1','1','1','3','3','4']
comp = [ a!=c for (a,c) in zip(A,C)]
print(comp)
>> [True,True,True,False,False,False]
因此,我们要审查:
请注意复制列表的用法:
result = [int(b) for c,b in zip(comp,B) if c] # note the int(b)
>> [5, 9, 3]
print(sum(result))
>> 17
注意列表理解的使用:
C = A[:]
注意zip
功能的使用:
comp = [ x for y in z]
result = [ x for y in z if q]
我将把它作为一个练习,将步骤折叠成单个列表理解的总和。现在我知道列表
a
本身不会改变,但是您表达了改变的想法,这意味着列表有分区,其中有不同的相邻元素,然后,我想到了一个不同的解决方案:
根据您的原始数据:
for (a,c) in zip(A,C)
我们可以使用defaultdict
对这些数据进行分组:
A = ['1','1','1','3','3','4']
B = ['5','9','3','4','8','1']
只是为了展示我们收集的信息:
from collections import defaultdict
D = defaultdict(list)
for a, b in zip(A,B):
D[a].append(int(b))
现在我们可以计算一些总和:
for a, b in D.items():
print(a,b)
>> 1 [5, 9, 3]
>> 3 [4, 8]
>> 4 [1]
关于defaultdict的说明
:
创建实例时:
result = [sum(b) for a,b in D.items()]
print(result)
>> [17, 12, 1]
这将创建一个defaultdict
,当它遇到新键时,将创建参数的实例。在这种情况下,它会创建一个新的列表
因此,每一行:
D = defaultdict(list)
当
a
是一个D
以前从未见过的键时,将创建一个新的列表
,该列表将返回(..
已应用。您愿意与我们分享您的努力吗?。否则,这太广泛了,因为您要求我们为您编写代码。请提供预期的输出和/或尝试。ATM不清楚您在问什么欢迎使用StackOverflow!请尝试编写一个,在其中显示您自己的代码、您得到的结果和您的输出相反,pect。通过这种方式,您更有可能快速获得帮助。我一直在尝试为此编写代码,但我不清楚如何进行。我试图实现的是,当列表A中的值从1更改为3时,从列表A中的值更改点查找下一个列表中的值之和,例如5+9+3,等等d so on.@M.Chan.我想我们理解你的问题,我只是想让你思考这个问题。这对你作为一名程序员来说是一项至关重要的技能。但是,要解决堆栈溢出问题,你需要自己编写一些代码。这样我们就可以理解你是如何思考这个问题的。嗨,comp会是怎样的回到列表B?我使用了您的步骤和示例,但我似乎没有得到相同的结果。对于comp我得到[False,False,False,False,False,False],对于sum(result)我得到0。然后,您似乎还没有获取列表的副本,以便稍后在比较中使用。“a=['3','3','3','3','3','4']B=['5','9','3','4','8','1']C=a[:]comp[A!=C表示压缩(A,C)]打印(comp)结果=[int(B)表示压缩(comp,B)如果C]打印(sum(result))'这给了我comp=[False,False,False,False,False,False,False]和sum(result)=0谢谢你,伙计,这正是需要的。我不知道defaultdict。现在这是另一个问题。把它作为一个新问题发布。
D[a].append(int(b))