Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3.6:当列表中的一个值发生变化时,是否在另一个列表中找到这些值的总和?_Python_List_Sum - Fatal编程技术网

Python3.6:当列表中的一个值发生变化时,是否在另一个列表中找到这些值的总和?

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 = ['

当列表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 = ['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))