【问题标题】:How to get the original position of the element from the blocks of the list after sorting it?排序后如何从列表的块中获取元素的原始位置?
【发布时间】:2020-06-12 07:36:46
【问题描述】:

我有 4 个价格清单和 1 个偏差清单,总共包含 30 个价格,这些价格分为 5 个块,每块 6 个元素。它们最初只是简单地出现在列表中。

price1 =[2, 1, 22, 2, 23, 2, 5, 21, 21, 27, 2, 22, 55, 2, 8, 2, 3, 3, 3, 13, 23, 77, 22, 23, 2, 6, 7, 9, 2, 2]

price2 =[2, 12, 72, 22, 13, 22, 65, 61, 23, 25, 2, 2, 51, 2, 8, 2, 3, 3, 3, 13, 23, 77, 22, 23, 2, 6, 7, 9, 2, 21]

price3 =[21, 52, 72, 22, 93, 32, 85, 61, 23, 25, 2, 2, 51, 2, 8, 2, 3, 31, 3, 13, 53, 67, 23, 83, 2, 16, 74, 19, 2, 11]

price4 =[27, 12, 82, 12, 23, 32, 35, 41, 27, 25, 21, 2, 51, 21, 18, 22, 3, 21, 31, 33, 13, 67, 23, 83, 21, 26, 74, 29, 23, 51]

Deviation =[-17, -2, -2, 52, 13, -32, -15, 71, 27, 25, -221, 21, -151, -21, 128, -22, 312, 212, -31, -533, 13, -227, -123, 183, 21, 26, 74, -129, -23, -21]

现在我将这些价格表分成 5 个块,每块 6 个元素,然后,我从列表的每个块中获取前 3 个最高价格。我的做法:

n = 6
a = [price1[i:i + n] for i in range(0, len(price1), n)]
b = [price2[i:i + n] for i in range(0, len(price2), n)]
c = [price3[i:i + n] for i in range(0, len(price3), n)]
d = [price4[i:i + n] for i in range(0, len(price4), n)]


newPrice1 = [sorted(block, reverse=True)[:3] for block in a]
newPrice2 = [sorted(block, reverse=True)[:3] for block in b]
newPrice3 = [sorted(block, reverse=True)[:3] for block in c]
newPrice4 = [sorted(block, reverse=True)[:3] for block in d]

print("Top 3 Highest Prices in list 1:", newPrice1)
print("Top 3 Highest Prices in list 2:", newPrice2)
print("Top 3 Highest Prices in list 3:", newPrice3)
print("Top 3 Highest Prices in list 4:", newPrice4)
print("Max among all the prices: ", max(newPrice1, newPrice2, newPrice3, newPrice4))

输出:

5 blocks division of price1: [[2, 1, 22, 2, 23, 2], [5, 21, 21, 27, 2, 22], [55, 2, 8, 2, 3, 3], [3, 13, 23, 77, 22, 23], [2, 6, 7, 9, 2, 2]]
5 blocks division of price2: [[2, 12, 72, 22, 13, 22], [65, 61, 23, 25, 2, 2], [51, 2, 8, 2, 3, 3], [3, 13, 23, 77, 22, 23], [2, 6, 7, 9, 2, 21]]
5 blocks division of price3: [[21, 52, 72, 22, 93, 32], [85, 61, 23, 25, 2, 2], [51, 2, 8, 2, 3, 31], [3, 13, 53, 67, 23, 83], [2, 16, 74, 19, 2, 11]]
5 blocks division of price4: [[27, 12, 82, 12, 23, 32], [35, 41, 27, 25, 21, 2], [51, 21, 18, 22, 3, 21], [31, 33, 13, 67, 23, 83], [21, 26, 74, 29, 23, 51]]

Top 3 Highest Prices in list 1: [[23, 22, 2], [27, 22, 21], [55, 8, 3], [77, 23, 23], [9, 7, 6]]
Top 3 Highest Prices in list 2: [[72, 22, 22], [65, 61, 25], [51, 8, 3], [77, 23, 23], [21, 9, 7]]
Top 3 Highest Prices in list 3: [[93, 72, 52], [85, 61, 25], [51, 31, 8], [83, 67, 53], [74, 19, 16]]
Top 3 Highest Prices in list 4: [[82, 32, 27], [41, 35, 27], [51, 22, 21], [83, 67, 33], [74, 51, 29]]

Max among all the prices:  [[93, 72, 52], [85, 61, 25], [51, 31, 8], [83, 67, 53], [74, 19, 16]]

#There is some mistake in getting the max value also because in the second block, there should be 27 instead of 25, 
#similarly, it should be 21 instead 0f 8, 29 instead of 16 in 5th block.

现在你可以看到第一个最大元素是 93,它在 price3 列表中,最初它在第 4 位,所以应该在 deviation 列表中搜索第 4 位,这个位置的元素是 13。类似地, 72 在 price2 和 price3 两者中,所以它可以返回任何位置,没有限制,所以假设它占据了 price2 位置,它最初在第 2 位置。所以第二个偏差位置的元素是-2,依此类推。 我想要的输出:

Deviation = [[13,-2,-2], [-15,71,25], [-151,212,128], [183,-227,13], [74,-129, 26]]

我只想要价格列表中那些最大元素的位置。

【问题讨论】:

    标签: python python-3.x list indexing


    【解决方案1】:

    您的总体最大值计算是错误的,因为它只为您提供了最大的内部列表 - 而不是所有 4 个列表的最大列值。

    您可以尽早将偏差压缩到计算中并执行 - 当使用排序/最大值时,您指定一个有利于该值的键并忽略所携带的偏差值:

    pd1 = list(zip(price1,Deviation))
    pd2 = list(zip(price2,Deviation))
    pd3 = list(zip(price3,Deviation))
    pd4 = list(zip(price4,Deviation))
    
    n = 6
    a = [pd1[i:i + n] for i in range(0, len(pd1), n)]
    b = [pd2[i:i + n] for i in range(0, len(pd2), n)]
    c = [pd3[i:i + n] for i in range(0, len(pd3), n)]
    d = [pd4[i:i + n] for i in range(0, len(pd4), n)]
    
    newPrice1 = [sorted(block, reverse=True, key = lambda x: x[0])[:3] for block in a]
    newPrice2 = [sorted(block, reverse=True, key = lambda x: x[0])[:3] for block in b]
    newPrice3 = [sorted(block, reverse=True, key = lambda x: x[0])[:3] for block in c]
    newPrice4 = [sorted(block, reverse=True, key = lambda x: x[0])[:3] for block in d]
    
    print("Top 3 Highest Prices/Deviation in list 1:", newPrice1)
    print("Top 3 Highest Prices/Deviation in list 2:", newPrice2)
    print("Top 3 Highest Prices/Deviation in list 3:", newPrice3)
    print("Top 3 Highest Prices/Deviation in list 4:", newPrice4)
    
    rv = []
    dv = []
    for i in range(len(newPrice1)):
        rv.append([])
        dv.append([])
        for j in range(3):
            m = max(newPrice1[i][j],newPrice2[i][j],newPrice3[i][j],newPrice4[i][j])
            rv[-1].append(m[0])
            dv[-1].append(m[1])
    
    print(rv)
    print(dv)
    

    输出:

    Top 3 Highest Prices/Deviation in list 1: [[(23, 13), (22, -2), (2, -17)], 
        [(27, 25), (22, 21), (21, 71)], [(55, -151), (8, 128), (3, 312)], 
        [(77, -227), (23, 13), (23, 183)], [(9, -129), (7, 74), (6, 26)]]
    
    Top 3 Highest Prices/Deviation in list 2: [[(72, -2), (22, 52), (22, -32)],
        [(65, -15), (61, 71), (25, 25)], [(51, -151), (8, 128), (3, 312)], 
        [(77, -227), (23, 13), (23, 183)], [(21, -21), (9, -129), (7, 74)]]
    
    Top 3 Highest Prices/Deviation in list 3: [[(93, 13), (72, -2), (52, -2)], 
        [(85, -15), (61, 71), (25, 25)], [(51, -151), (31, 212), (8, 128)], 
        [(83, 183), (67, -227), (53, 13)], [(74, 74), (19, -129), (16, 26)]]
    
    Top 3 Highest Prices/Deviation in list 4: [[(82, -2), (32, -32), (27, -17)], 
        [(41, 71), (35, -15), (27, 27)], [(51, -151), (22, -22), (21, -21)], 
        [(83, 183), (67, -227), (33, -533)], [(74, 74), (51, -21), (29, -129)]]
    
    
    [[93, 72, 52], [85, 61, 27], [55, 31, 21], [83, 67, 53], [74, 51, 29]]
    [[13, -2, -2], [-15, 71, 27], [-151, 212, -21], [183, -227, 13], [74, -21, -129]]
    

    【讨论】:

    • 嘿,谢谢,这可以正常工作,但您的输出也有错误。正如我提到的,当我们计算最大值时,在第二个区块中,最高价格应该是 27(不是 25),第三个区块最大元素应该是 55(不是 51),第三个区块最大值应该是 21(不是 8),在第 5 个块中,最大元素应该是 51(不是 19)和 29(不是 16)
    • @nipu 似乎您想要列最大值?不是内部列表的最大值 ....
    • @nipun - 嗯 - 简单的循环应该可以解决这个问题。见编辑。
    【解决方案2】:

    这里有一个解决您问题的方法,虽然看起来比较冗长,但确实有效。

    price1 =[2, 1, 22, 2, 23, 2, 5, 21, 21, 27, 2, 22, 55, 2, 8, 2, 3, 3, 3, 13, 23, 77, 22, 23, 2, 6, 7, 9, 2, 2]
    
    price2 =[2, 12, 72, 22, 13, 22, 65, 61, 23, 25, 2, 2, 51, 2, 8, 2, 3, 3, 3, 13, 23, 77, 22, 23, 2, 6, 7, 9, 2, 21]
    
    price3 =[21, 52, 72, 22, 93, 32, 85, 61, 23, 25, 2, 2, 51, 2, 8, 2, 3, 31, 3, 13, 53, 67, 23, 83, 2, 16, 74, 19, 2, 11]
    
    price4 =[27, 12, 82, 12, 23, 32, 35, 41, 27, 25, 21, 2, 51, 21, 18, 22, 3, 21, 31, 33, 13, 67, 23, 83, 21, 26, 74, 29, 23, 51]
    
    Deviation =[-17, -2, -2, 52, 13, -32, -15, 71, 27, 25, -221, 21, -151, -21, 128, -22, 312, 212, -31, -533, 13, -227, -123, 183, 21, 26, 74, -129, -23, -21]
    
    n = 6
    a = [price1[i:i + n] for i in range(0, len(price1), n)]
    b = [price2[i:i + n] for i in range(0, len(price2), n)]
    c = [price3[i:i + n] for i in range(0, len(price3), n)]
    d = [price4[i:i + n] for i in range(0, len(price4), n)]
    
    
    newPrice1 = [sorted(block, reverse=True)[:3] for block in a]
    newPrice2 = [sorted(block, reverse=True)[:3] for block in b]
    newPrice3 = [sorted(block, reverse=True)[:3] for block in c]
    newPrice4 = [sorted(block, reverse=True)[:3] for block in d]
    
    print("Top 3 Highest Prices in list 1:", newPrice1)
    print("Top 3 Highest Prices in list 2:", newPrice2)
    print("Top 3 Highest Prices in list 3:", newPrice3)
    print("Top 3 Highest Prices in list 4:", newPrice4)
    print("Max among all the prices: ", max(newPrice1, newPrice2, newPrice3, newPrice4))
    
    #the code that i changed starts from here
    
    max_l=max(newPrice1, newPrice2, newPrice3, newPrice4)
    index_l=[]
    v=[]
    inde=0
    inde_1=0
    for i in max_l:
        v=[]
        for j in i:
            if j in price1:
                inde=price1.index(j)
                inde_1=Deviation[inde]
                v.append(inde_1)
            elif j in price2:
                inde=price2.index(j)
                inde_1=Deviation[inde]
                v.append(inde_1)
            elif j in price3:
                inde=price3.index(j)
                inde_1=Deviation[inde]
                v.append(inde_1)
            elif j in price4:
                inde=price4.index(j)
                inde_1=Deviation[inde]
                v.append(inde_1)
            else:
                print("not present")
        index_l.append(v)
    print(index_l) 
    

    输出:

    [[13, -2, -2], [-15, 71, 25], [-151, 212, 128], [183, -227, 13], [74, -129, 26]]
    

    希望这对你有用,如果我误解了什么,请告诉我。

    【讨论】:

    • 谢谢它的工作原理,但是在计算列表中的最大值时再次出现相同的错误。示例:第 3 块中的最大值将为 55(不是 51)、21(不是 8),在第 5 块中为 51(不是 19)、29(不是 16)。
    猜你喜欢
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多