合并两个列表并打印与某个值对应的所有值

2024-09-30 12:28:59 发布

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

我需要合并两个列表,然后计算与某个值对应的所有值。你知道吗

这两个列表是:

inControl = ["False", "False", "True", "True","False", "True", "False", "True", "True", "False", "False", "False", "False", "False", "False", "True", "False", "True", "False", "False"]

rts = [379, 396, 480, 443, 365, 280, 487, 446, 350, 367, 405, 391, 484, 359, 367, 305, 359, 479, 436, 333]

我需要对所有rts值对应的所有False值求和,然后对True值求和(它们都是按顺序排列的)。你知道吗

我基本上已经把这两个列表组合成了zip函数,但是我完全不知道接下来该怎么做。。。任何帮助都将不胜感激。你知道吗

非常感谢:)


Tags: 函数falsetrue列表ziprtsincontrol
3条回答

给出:

inControl = ["False", "False", "True", "True","False", "True", "False", "True", "True", "False", "False", "False", "False", "False", "False", "True", "False", "True", "False", "False"]
rts = [379, 396, 480, 443, 365, 280, 487, 446, 350, 367, 405, 391, 484, 359, 367, 305, 359, 479, 436, 333]

我假设inControl是字符串列表,而不是布尔值列表。为了使我的解决方案有效,我将把inControl转换为布尔列表:

inControl = [element == 'True' for element in inControl]  # ==> [False, False, ...]

使用itertools.compress计算所有True元素的总和:

import itertools
true_sum = sum(itertools.compress(rts, inControl))  # 2783

现在,我们可以计算false_sum

grand_sum = sum(rts)              # 7911
false_sum = grand_sum - true_sum  # 5128

让-弗朗索瓦的解决方案将很好地工作,是相当可读性。不过,它确实对数据进行了两次传递。如果列表很小,这并不是什么大问题,但是如果列表很大,你可以通过单次传递将操作时间大致减少一半。你知道吗

一种通用方法是:

totals = {}
for flag, value in zip(inControl, rts):
    totals[flag] = totals.setdefault(flag, 0) + value

此代码不假定inControl只有FalseTrue。它实际上可以有任意数量的唯一值。你知道吗

更可爱的方法是使用Counter模块中的collections类。是一个用来记录计数的字典。添加两个计数器做了一件显而易见的事情:相同键的值相加。我们可以为每对元素创建一个Counter实例,并将所有计数器相加。请注意,为每个元素创建一个Counter可能有点过头了——上面的解决方案更有效。但出于教育目的,此解决方案类似于:

from collections import Counter
counters = (Counter({k: v}) for k, v in zip(inControl, rts))
sum(counters, Counter())

看起来很奇怪,布尔是弦,但是。。。你知道吗

在匹配元素上使用zip,然后使用sum。你知道吗

(为python3中的另一部分重新创建zip,因为zip是iterable)

inControl = ["False", "False", "True", "True","False", "True", "False", "True", "True", "False", "False", "False", "False", "False", "False", "True", "False", "True", "False", "False"]

rts = [379, 396, 480, 443, 365, 280, 487, 446, 350, 367, 405, 391, 484, 359, 367, 305, 359, 479, 436, 333]

z=zip(rts,inControl)
sf=sum(x[0] for x in z if x[1]=='False')
z=zip(rts,inControl)
st=sum(x[0] for x in z if x[1]=='True')
print(sf,st)

结果:

5128 2783

也许st可以通过与sum:st=sum(rts)-sf进行较少的字符串比较来计算(添加越多,字符串比较越少)

变量:真与假的小循环

s=dict()

for c in ['False','True']:
    z=zip(rts,inControl)
    s[c]=sum(x[0] for x in z if x[1]==c)

相关问题 更多 >

    热门问题