【问题标题】:How to get index of the max element from two lists after sorting it?排序后如何从两个列表中获取最大元素的索引?
【发布时间】:2020-06-11 13:52:39
【问题描述】:

我有三个列表 price1price2deviation。我想在price1price2 之间找到前三名的最高价格。因此,为了实现这一点,我首先按降序对它们进行排序,然后我从列表price1price2 中取出前三个元素,然后,我找到了每个最大值之间的最大值。现在我想知道在这一切之后获得的最大值的原始位置,以便我可以把它放在deviation中。对price1price2进行排序之前:

price1 = [12,1,2,4,45,67,433,111,45,12] #Total 10 elements in all the lists
price2 = [23,12,233,11,54,232,323,12,42,4]
deviation = [23,45,56,67,78,786,45,34,2,1]

排序后得到前3名的价格:

print("Price1: ",sorted(price1, reverse=True))
print("Price2: ",sorted(price2, reverse=True))

输出:

Price1:  [433, 111, 67]
Price2:  [323, 233, 232]

要从中获得最大值:

sortedPrice1 = sorted(price1, reverse=True)
sortedPrice2 = sorted(price2, reverse=True)
print("Price1: ", sortedPrice1[:3])
print("Price2: ", sortedPrice2[:3])
for i,j in zip(sortedPrice1[:3], sortedPrice2[:3]):
    print("max: ", max(i, j))

输出:

Price1:  [433, 111, 67]
Price2:  [323, 233, 232]
max:  433
max:  233
max:  232

现在我想要的是找到这些最大值的位置。例如:

433 is in `price1` at 6th position
233 is in `price2` at 2nd position
232 is in `price2` at 5th position

最后我想把这些仓位放到deviation列表中,得到这些价格前面的值。所以:

deviation[6] = 45
deviations[2] = 56
deviations[5] = 786

【问题讨论】:

  • 你试过list.index(number)吗?
  • 我觉得你在这里添加了不必要的步骤。

标签: python python-3.x list indexing


【解决方案1】:

不用list.index()zip()就够了:

price1 = [12,1,2,4,45,67,433,111,45,12] #Total 10 elements in all the lists
price2 = [23,12,233,11,54,232,323,12,42,4]
deviation = [23,45,56,67,78,786,45,34,2,1]

for a, b, _ in zip( sorted(zip(price1, deviation), key=lambda k: k[0], reverse=True),
                    sorted(zip(price2, deviation), key=lambda k: k[0], reverse=True), range(3) ):  # range(3) because we want max 3 elements
    print(max(a, b, key=lambda k: k[0]))

打印:

(433, 45)
(233, 56)
(232, 786)

编辑:要在price1/price2/deviation 列表中有子列表,您可以这样做:

price1 = [[12, 2, 3, 4],[1, 2, 5, 56],[12,34,45,3],[23,2,3,4],[1,6,55,34]]
price2 = [[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4]]
deviation = [[10, 20, 30, 40],[10, 20, 30, 40],[10, 20, 30, 40],[10, 20, 30, 40],[10, 20, 30, 40]]

for p1, p2, dev in zip(price1, price2, deviation):
    print('price1=', p1)
    print('price2=', p2)
    print('dev=', dev)
    for a, b, _ in zip( sorted(zip(p1, dev), key=lambda k: k[0], reverse=True),
                        sorted(zip(p2, dev), key=lambda k: k[0], reverse=True), range(3) ):  # range(3) because we want max 3 elements
        print(max(a, b, key=lambda k: k[0]))
    print()

打印:

price1= [12, 2, 3, 4]
price2= [1, 2, 3, 4]
dev= [10, 20, 30, 40]
(12, 10)
(4, 40)
(3, 30)

price1= [1, 2, 5, 56]
price2= [1, 2, 3, 4]
dev= [10, 20, 30, 40]
(56, 40)
(5, 30)
(2, 20)

price1= [12, 34, 45, 3]
price2= [1, 2, 3, 4]
dev= [10, 20, 30, 40]
(45, 30)
(34, 20)
(12, 10)

price1= [23, 2, 3, 4]
price2= [1, 2, 3, 4]
dev= [10, 20, 30, 40]
(23, 10)
(4, 40)
(3, 30)

price1= [1, 6, 55, 34]
price2= [1, 2, 3, 4]
dev= [10, 20, 30, 40]
(55, 30)
(34, 40)
(6, 20)

【讨论】:

  • 我的原始清单中有块,实际有 5 个价目表。假设总共有 5 个块,每个块包含 4 个元素。例如:price1 = [[12, 2, 3, 4][1, 2, 5, 56][12,34,45,3][23,2,3,4][1,6,55,34 ]] 同样适​​用于所有 5 个价目表
  • 每个价目表中每个区块的前 3 个最大数字。现在,我必须找到它原来的位置。
  • 因此,当您说 range(3) 代表前三个元素时,在这种情况下将不起作用,因为这实际上是每个价目表每个块中的前三个元素。
【解决方案2】:

列表方法index 返回一个元素在列表中的位置。如果您将 max 函数替换为 if 语句,则可以产生所需的输出

for i,j in zip(sortedPrice1[:3], sortedPrice2[:3]):
    if i > j:
        print("%d is in `price1` at the %dth position" % (i, price1.index(i))
    else:
        print("%d is in `price2` at the %dth position" % (j, price2.index(j))

注意这段代码:

  1. 不处理情况i=j
  2. 不处理 price1/price2 的多个成员,它们都在前三名。

【讨论】:

  • 但这些情况很重要。有什么技巧可以处理这些吗?
  • 再一次,这个 If 和 else 仅限于两个列表。如果有两个以上的价目表,我该如何使用它。
【解决方案3】:

您也可以使用 try / except 来做到这一点,但与@Yberman 在他的回答中所述的限制相同,但不需要定义除列表本身之外的任何其他变量:

price1 = [12,1,2,4,45,67,433,111,45,12] #Total 10 elements in all the lists
price2 = [23,12,233,11,54,232,323,12,42,4]
deviation = [23,45,56,67,78,786,45,34,2,1]
for i,j in zip(sorted(price1,reverse=True)[:3], sorted(price2,reverse=True)[:3]):
    try:
      print(deviation[price1.index(max(i, j))])
    except ValueError:
      print(deviation[price2.index(max(i,j))])

输出:

45
56
786

【讨论】:

    【解决方案4】:

    首先创建所有 3 个列表的副本,例如,

    price1 = [12,1,2,4,45,67,433,111,45,12] #Total 10 elements in all the lists
    price2 = [23,12,233,11,54,232,323,12,42,4]
    deviation = [23,45,56,67,78,786,45,34,2,1]
    
    d_p1=price1
    d_p2=price2
    d_dev=deviation
    

    然后执行所有操作以获取此重复列表上的最大元素, 然后当您在列表中有最大元素时,例如,

    max_l=[433,233,232]
    

    遍历此列表以获取位置,

    for i  in max_l:
       if i in price_1:
           print("index:",price_1.index(i))
       else:
           print("index:",price_2.index(i))
    

    如果元素的位置在执行一些操作后发生了变化,那么这个过程可以帮助找到原始位置。

    【讨论】:

      【解决方案5】:

      两行代码就可以搞定。

      先找到索引。

      item_index_in_original_list = price1.index(433)
      

      然后在你的偏差列表中使用它

      deviation_of_max_item = deviation[item_index_in_original_list]
      

      要对其他项目重复此操作,您可以使用这两行创建一个函数并调用它。

      def find_deviation(item_value,original_list):
          item_index_in_original_list = original_list.index(item_value)
          return deviation[item_index_in_original_list]
      
      required_deviation = find_deviation(433, price1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        相关资源
        最近更新 更多