我想通过一系列迭代来搜索局部最大值和最小值,直到列表只剩下一个元素。那么最后一个元素就是“获胜者”。该列表包含成对的玩家姓名以及用冒号分隔的相应整数。
简而言之:
问题是,在局部最小值搜索之后,当列表仍然有多个项目时,我似乎无法正确地进行局部最大值搜索和下一次迭代。所以结果似乎与我的预期不符。
这是我的代码。
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 个元素。
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
minima2 e:50 风神:101 jaki:51
最大2 101
所以这里的获胜者是 101,在第 2 轮中找到。
事实证明,我不得不重新考虑一切。发布答案,以防将来对某人有用。
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)
结果符合预期。