【问题标题】:Match sequential values of 2 lists匹配 2 个列表的顺序值
【发布时间】:2022-01-03 20:43:39
【问题描述】:

我想匹配 2 个列表 a 和 b 中的顺序值对,并从 b 列表中删除值,只保留 b 的第一个较大值(与 a 相比)与 a 相同的索引位置。让我们看一个简单的例子

a = [206, 252, 272, 315, 349, 374, 394, 406, 440, 466]
b = [209, 220, 244, 255, 285, 301, 327, 358, 380, 396, 419, 447, 476, 492]

首先查看列表 a 中索引 0 处的值 如果索引 0 处的 b 值较小,则应将其从 b 中删除 接下来看看 b 中的索引 1 ,如果小于 a[0] 它也应该被删除等等......

最终结果应该是:

b = [209,255,285,327,358,380,396,419,447,476]

我的想法是尝试嵌套的 for 循环

for idx, j in enumerate(a):
    for jdx, k in enumerate(b):
        if b[jdx] < a[idx]:
           del b[jdx]

但是,我无法得到我想要的最终结果......

【问题讨论】:

  • 听起来可能很有趣,但很不清楚。
  • @KellyBundy ,试图澄清。希望有帮助
  • 仍不清楚。如果您明确地进行更多比较/删除(例如说明比较哪些数字、删除哪些数字以及列表/指针在每个步骤之后的外观),将会有所帮助。

标签: python list for-loop


【解决方案1】:

您的代码很接近,但它不会像您想要的那样移动到列表 a 中的下一个值。这段代码给出了预期的结果:

a = [206, 252, 272, 315, 349, 374, 394, 406, 440, 466]
b = [209, 220, 244, 255, 285, 301, 327, 358, 380, 396, 419, 447, 476, 492]
output = []
for idx, j in enumerate(a):
    for jdx, k in enumerate(b):
        if b[jdx] >= a[idx]:
            output.append(b[jdx])
            break
print(output)

输出:

[209, 255, 285, 327, 358, 380, 396, 419, 447, 476]

【讨论】:

    【解决方案2】:

    我认为这是一个可以接受的解决方案:

    a = [206, 252, 272, 315, 349, 374, 394, 406, 440, 466]
    b = [209, 220, 244, 255, 285, 301, 327, 358, 380, 396, 419, 447, 476, 492]
    
    result = []
    
    try:
        a_iter = iter(a)
        b_iter = iter(b)
        a_value = next(a_iter)
        b_value = next(b_iter)
        while True:
    
            if a_value < b_value:
                result.append(b_value)
                a_value = next(a_iter)
                b_value = next(b_iter)
            else:
                b_value = next(b_iter)
    
    except StopIteration:
        print(result)
    

    【讨论】:

    • b 不应包含 492,因为在记录 476 之后,a 中没有更多值可以与 492 进行比较。根据我对他解释的理解。
    • @EliHarold 我编辑了我的答案。
    • @RobinDillen,感谢不错的替代解决方案
    • @RobinDillen 太棒了! (+1)
    【解决方案3】:

    简单高效的解决方案,只要b[i]大于a[i]就去下一个索引:

    i = 0
    n = len(a)
    for b[i] in b:
        if i < n and b[i] > a[i]:
            i += 1
    del b[i:]
    

    或者带哨兵:

    i = 0
    a += b[-1:]
    for b[i] in b:
        if b[i] > a[i]:
            i += 1
    del b[i:]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2017-05-20
      • 2011-12-31
      相关资源
      最近更新 更多