如何在不使用 numpy 的情况下对列表中的局部最小值和最大值进行切片直到最后一项

问题描述 投票:0回答:1

我想通过一系列迭代来搜索局部最大值和最小值,直到列表只剩下一个元素。那么最后一个元素就是“获胜者”。该列表包含成对的玩家姓名以及用冒号分隔的相应整数。
简而言之:

  1. 对于任何迭代,我都会从搜索最小值开始,然后仅当我当前的最小值列表剩余多个元素时才继续检查最大值。
  2. 对于每次迭代,我只保留局部最小值和最小值的列表,因此显然每次搜索/迭代列表都会变得更小。
  3. 如果列表中仍有多个元素,我会进行迭代,直到只有一个元素。
  4. 我希望能够使用变量“round”查看完成了多少次迭代。
  5. 对于局部最小值搜索,仅当列表中的第一项小于下一项时,才会包含该项。此外,如果最后一项小于前一项,则将包括最后一项。对于局部最大值搜索反之亦然。

问题是,在局部最小值搜索之后,当列表仍然有多个项目时,我似乎无法正确地进行局部最大值搜索和下一次迭代。所以结果似乎与我的预期不符。

这是我的代码。

def select_mid(players: str):

    player_list = players.split()  # Split the input string into individual name:identifier pairs
    ranks = [int(pair.split(":")[1]) for pair in player_list]  # Extract and convert the identifiers to integers

    minima_list = []
    maxima_list = []
    round = 0
    for i in range(1, len(ranks)):
        if len(player_list) > 1:
            # Here search is "current_rank < prev_rank and current_rank < next_rank"
            prev_rank, current_rank, next_rank = ranks[i-1], ranks[i], ranks[i] if i == len(ranks) - 1 else ranks[i+1]
            if current_rank < prev_rank and current_rank < next_rank:
                minima_list.append(player_list[i])
                player_list = minima_list 
            
            #Here search is "current_rank > prev_rank and current_rank > next_rank"
                if current_rank > prev_rank and current_rank > next_rank:
                    maxima_list.append(player_list[i])
                    player_list = maxima_list 
                round +=1 
                
        elif len(player_list) == 1:
            selection = player_list[0]
    
    return f"{selection} is selected in round: {round} "

# Example inputs:
    result = select_mid("Hulk:70 Kitana:83 Kunglao:20 goro:68 e:50 f:67 DE:40 Ef:177 Sindel:130 Konami:179 Fifa:95 ps:123 Fujin:101 name:134 Hola:89 Amari:205 Shakur:175 Rambo:303 Clay:33 Sheba:725 jaki:51")
    print(result)

我得到了 Kunglao:20 作为第一轮的获胜者。很明显,我无法正确地进行最大值搜索并相应地迭代,直到最终列表有 1 个元素。

预期结果:

迭代1

minima1 绿巨人:70 Kunglao:20 e:50 DE:40 Sindel:130 Fifa:95 Fujin:101 Hola:89 Shakur:175 Clay:33 jaki:51

maxima1 浩克:70 e:50 辛德尔:130 福金:101 沙库尔:175 贾基:51

迭代2

minima2 e:50 风神:101 jaki:51

最大2 101

所以这里的获胜者是 101,在第 2 轮中找到。

python list max min
1个回答
0
投票

事实证明,我不得不重新考虑一切。发布答案,以防将来对某人有用。

def select_mid(all):
    rounds = 0  # Initialize the number of rounds to 0
    pairs_list = all.split()
    while len(pairs_list) > 1:
        rounds += 1  # Increment the round count at the start of each iteration
        local_minima = []  # List to store local minima
        local_maxima = []  # List to store local maxima

        # Search for local minima
        # Dealing with the first element in the list if its local less than next element
        if int(pairs_list[0].split(":")[1]) < int(pairs_list[1].split(":")[1]):
            local_minima.append(pairs_list[0])
            
        # Dealing with the elements within
        for i in range(1, len(pairs_list) - 1):
            name, rank = pairs_list[i].split(":")
            prev_rank = int(pairs_list[i - 1].split(":")[1])
            next_rank = int(pairs_list[i + 1].split(":")[1])

            if int(rank) < prev_rank and int(rank) < next_rank:
                local_minima.append(pairs_list[i])

        # Include the last item in local minima if it is a local minima
        if int(pairs_list[-1].split(":")[1]) < int(pairs_list[-2].split(":")[1]):
            local_minima.append(pairs_list[-1])

        # If there are local minima and more than one element, search for local maxima
        if local_minima and len(local_minima) > 1:
            if int(local_minima[0].split(":")[1]) > int(local_minima[1].split(":")[1]):
                local_maxima.append(local_minima[0])

            for i in range(1, len(local_minima) - 1):
                name, rank = local_minima[i].split(":")
                prev_rank = int(local_minima[i - 1].split(":")[1])
                next_rank = int(local_minima[i + 1].split(":")[1])

                if int(rank) > prev_rank and int(rank) > next_rank:
                    local_maxima.append(local_minima[i])

            # Include the last item in local maxima if it is a local maxima
            if int(local_minima[-1].split(":")[1]) > int(local_minima[-2].split(":")[1]):
                local_maxima.append(local_minima[-1])

            # Update the list with local maxima
            pairs_list = local_maxima
        else:
            # If there are no local maxima, update the list with local minima
            pairs_list = local_minima

    # Extract and print the name from the remaining pair
    if pairs_list:
        name, id = pairs_list[0].split(":")
        
    return f"The winner is {name} (id: {id}) selected in round {rounds}"

# Example list of pairs containing names and ranks
all = "Hulk:70 Kitana:83 Kunglao:20 goro:68 e:50 f:67 DE:40 Ef:177 Sindel:130 Konami:179 Fifa:95 ps:123 Fujin:101 name:134 Hola:89 Amari:205 Shakur:175 Rambo:303 Clay:33 Sheba:725 jaki:51"
result = select_mid(all)
print(result)

结果符合预期。

© www.soinside.com 2019 - 2024. All rights reserved.