簡體   English   中英

比較列表元素與多個列表元素

[英]Compare list element with multiple list elements

我有兩個清單:

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

有人知道解決方案嗎?

一種使用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]]]

您寫道: “對於第一個列表中的每個條目” 所以我認為您已經將您的列表嵌套得更深了……我稍微弄平了您的列表,然后做了:

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))

如果您打算使用深層嵌套列表,則必須將列表展平( 請參見此處的示例

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

內置的zip函數非常適合迭代多個列表。 提議的解決方案在很大程度上依賴於它遞歸壓縮列表列表。 盡管它是單線的,但它肯定不是解決您問題的最易讀的解決方案。

注意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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM