比较列表元素与多个列表元素

2024-04-25 07:09:11 发布

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

我有两张单子:

targets = [ [ [4.88], [2.76], [0.4] ], [ [2.6], [2.12], [7.4], [0.2] ] ]
multiples = [ [ [4.2, 3.6, 6.3], [3.5, 2.5], [7.3, 0.5] ], [ [3.6, 0.3], [5.2, 8.6, 3.7], [3.6, 0.4], [2.3, 6.4] ] ]

对于第一个列表中的每个条目,第二个列表中都有多个条目。现在我想比较一下这些数字,并计算出低于traget数的数字的准确度。我尝试了下面的方法,但是我不知道如何比较一个单一值和多个值,以及如何同时引用它们。你知道吗

for element in targets:
    tmp = []
    for item in element:
        tmp2 = []
        if item > multiples

输出应该是这样的:

[ [ [2], [1], [0] ], [ [1], [0], [2], [0] ] ]

有人知道解决办法吗?你知道吗


Tags: 方法in列表for条目数字elementitem
3条回答

你写了:'对于第一个列表中的每个条目'。所以我想你已经把你的名单排得很深了。。。我把你的单子放平了一点然后做了:

targets_flat = [
    4.88, 2.76, 0.4,
    2.6, 2.12, 7.4, 0.2
]
multiples_flat = [
    [4.2, 3.6, 6.3], [3.5, 2.5], [7.3, 0.5],
    [3.6, 0.3], [5.2, 8.6, 3.7], [3.6, 0.4], [2.3, 6.4]
]

for ref, valuelist in zip(targets_flat, multiples_flat):
    lower = [v for v in valuelist if ref > v]
    print("reference: {} -> lower: {}".format(ref, lower))

如果深层嵌套列表是您的意图,那么您必须展平列表(see here an example

使用zip()sum()的一种解决方案:

targets = [ [ [4.88], [2.76], [0.4] ], [ [2.6], [2.12], [7.4], [0.2] ] ]
multiples = [ [ [4.2, 3.6, 6.3], [3.5, 2.5], [7.3, 0.5] ], [ [3.6, 0.3], [5.2, 8.6, 3.7], [3.6, 0.4], [2.3, 6.4] ] ]

out = []
for val1, val2 in zip(targets, multiples):
    out.append([[sum(i < j for i in vval2) for j in vval1] for (vval1, vval2) in zip(val1, val2)])

print(out)

印刷品:

[[[2], [1], [0]], [[1], [0], [2], [0]]]
In [4]: [[[len([v for v in vals if v < tg[0]])] for vals, tg in zip(mult, tl)] for mult, tl in zip(multiples, targets)]
Out[4]: [[[2], [1], [0]], [[1], [0], [2], [0]]]

^{}内置函数非常适合迭代多个列表。建议的解决方案在很大程度上依赖于它递归地压缩列表。 虽然这是一个单一的线性它肯定不是最可读的解决方案,你的问题。你知道吗

注意:围绕len()[]实际上只是为了匹配所需的输出。如果你忽略它,你会得到:

In [5]: [[len([v for v in vals if v < tg[0]]) for vals, tg in zip(mult, tl)] for mult, tl in zip(multiples, targets)]
Out[5]: [[2, 1, 0], [1, 0, 2, 0]]

相关问题 更多 >