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

2024-04-24 04:54:51 发布

您现在位置:Python中文网/ 问答频道 /正文

A = ['1','1','1','3','3','4']

B = ['5','9','3','4','8','1']

当列表A中的值更改时,例如从1更改为3。 在列表B中求一组值的和,例如(5,9,3)的和。 表A和表B大小相同。你知道吗

In list A = ['1','1','1','3','3','4']
SEARCH - 1) where value changes from 1 to 3, 2) where value changes from 3 to 4.

In list B = ['5','9','3','4','8','1']
RESULT - 1) sum only 5+9+3, 2) sum only 4+8.

有办法吗? 因为我想不出一个合乎逻辑的方法来绕过它。你知道吗

我的代码开始:

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的每个相邻值,看看它们是否相同,但我不知道如何将其与列表B的值联系起来。你知道吗


Tags: toinfromonly列表forsearchvalue
2条回答

你需要做的是想一个更简单的问题:

假设你有:

A = 1
B = 5

我们怎样才能发现A发生了变化?你知道吗

我们需要保留一个A的副本,以便在我们认为发生了变化时进行比较:

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

现在我们必须检测变化:

# 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]

现在我们知道哪些数字已经改变了,我们可以从B中选取相应的项目:

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[:]

注意列表理解的用法:

comp = [ x for y in z]
result = [ x for y in z if q]

注意zip函数的用法:

for (a,c) in zip(A,C)

我将把它作为一个练习,把这些步骤折叠成一个单子的总和。你知道吗

现在我明白了列表A本身不会改变,但是您表达了改变的想法,即列表有分区,其中有不同的相邻元素,然后想到了不同的解决方案:

根据您的原始数据:

A = ['1','1','1','3','3','4']

B = ['5','9','3','4','8','1']

我们可以使用defaultdict对这些数据进行分组:

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]

现在我们可以计算一些和:

result = [sum(b) for a,b in D.items()]
print(result)
>> [17, 12, 1]

关于defaultdict的注释:

创建实例时:

D = defaultdict(list)

这将创建一个defaultdict,当它遇到新的键时,它将创建参数的一个实例。在本例中,它创建一个新的list

所以每行:

D[a].append(int(b))

aD以前从未见过的键时,将创建一个新的list,并将.append(....应用于该键。你知道吗

相关问题 更多 >