【问题标题】:Compare list element with multiple list elements将列表元素与多个列表元素进行比较
【发布时间】:2019-08-16 12:55:57
【问题描述】:

我有两个列表:

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

有人知道解决办法吗?

【问题讨论】:

    标签: python list compare


    【解决方案1】:

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

    【讨论】:

    • 当我运行这个确切的代码时,我得到一个 TypeError: 'float' object is not callable。你知道为什么吗?
    • @maybeyourneighour 您是否复制/粘贴了确切的代码?也许你有某个地方) 丢失/或在错误的地方。我在 Python3/Python2.7 中测试过
    • 不幸的是,我只是复制粘贴它并在python3中测试它
    • @maybeyourneighour 在线版repl.it/repls/NoisyTechnicalLinuxkernel当你按"Run"时,它会打印[[[2], [1], [0]], [[1], [0], [2], [0]]]
    • @maybeyourneighour 这里的代码完全相同。
    【解决方案2】:
    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]]
    

    【讨论】:

      【解决方案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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-06
        • 2015-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        相关资源
        最近更新 更多