【问题标题】:How can I select the minimum y-value for x-y pairs?如何为 x-y 对选择最小 y 值?
【发布时间】:2023-01-13 01:58:30
【问题描述】:

我有以下两个数组:

x = [10, 10, 20, 20, 20]
y = [0.194, 0.183, 0.202, 0.169, 0.417]

x 数组具有相同值的重复项。如果我将这些值绘制为 x,y 对,则图形看起来像点列。

我想制作一个脚本,为给定的 x 值选择最低的 y 值,将该 y 值与其关联的 x 值连接起来,然后绘制该对。每个 x 值的其他 y 值将被忽略。

我试过使用嵌套的 for 循环、切片、if/else 语句等,但我什么都做不了。我得到的最常见结果是与所有 x 值连接的整个数组的最低 y 值。

【问题讨论】:

    标签: python


    【解决方案1】:

    这可能对你有用:

    from itertools import groupby
    from operator import itemgetter
    
    x = [10, 10, 20, 20, 20]
    y = [0.194, 0.183, 0.202, 0.169, 0.417]
    pairs = [(x, min(map(itemgetter(1), y))) for x, y in groupby(zip(x, y), itemgetter(0))]
    
    

    【讨论】:

    • 一个好的答案应该解释代码的作用,而不仅仅是转储代码
    【解决方案2】:

    我认为在线性时间内,O(n)。

    x = [10, 10, 20, 20, 20]
    y = [0.194, 0.183, 0.202, 0.169, 0.417]
    
    lowestDict = dict()
    for i in range(len(x)):
      currentY = lowestDict.get(x[i], None)
      if currentY is None or y[i] < currentY:
        lowestDict[x[i]] = y[i]
    
    pairs = [(k, v) for k, v in lowestDict.items()]
    print(pairs)
    

    【讨论】:

    • 如果您真正解释您的解决方案的作用而不是仅仅转储您的代码,将会有所帮助。
    • 另外,不要使用for i in range(len(x)) 进行迭代。做for i, x_elem in enumerate(x)。更好的是,因为你想同时迭代xy,做for x_elem, y_elem in zip(x, y)
    【解决方案3】:

    你可以在x上用float('inf')创建一个dict,然后使用zip,并为每个key保存miny。最后,将dict转换为tuples的list

    x = [10, 10, 20, 20, 20]
    y = [0.194, 0.183, 0.202, 0.169, 0.417]
    
    # create a 'dict' and use values of 'x' as 'key'
    dct = {i: float('inf') for i in x}
    
    # find min value for each 'key'
    for i, j in zip(x, y):
        dct[i] = min(dct[i], j)
    
    # convert 'dct' to 'list' of 'tuple's
    res = list(dct.items())
    print(res)
    

    输出:

    [(10, 0.183), (20, 0.169)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 2021-06-04
      • 2023-02-01
      • 2020-03-11
      • 2012-10-16
      • 1970-01-01
      相关资源
      最近更新 更多