问题描述
我正在尝试运行一个函数,该函数采用一个玩家等级列表,以创建一个字典(game_on),该字典的值应高于该游戏的平均等级(如果该游戏是公平的)(我在另一游戏中对此进行了设置)功能)。我无法理解为什么在运行第15行时无法运行在for循环中访问的列表
def is_fair_game(*player_ranks):
for args in player_ranks:
if len(player_ranks) == 0:
return False
if len(player_ranks) % 2 == 0:
highest = max(player_ranks)
lowest = min(player_ranks)
return highest-lowest <= 5
else:
return False
def matchmaking(**games):
game_on = {}
for g,args in games.items():
if is_fair_game(args[0:len(args)]) == False:
game_on[g] = 'not a fair game'
if is_fair_game(args) == True:
for i in args:
if i >= mean(args):
game_on[g].append[i]
if len(game_on[g]) == 0:
game_on[g] = 'not a fair game'
return game_on
matchmaking(game_1=[50,49,51,52],game_2=[71,73,71,71],game_3=[18,23,22,18])
The list of Game One doesn't run through my is_fair_game function
解决方法
-
args[0:len(args)]
与args
始终是同一件事(在您的情况下-因为您没有修改args
),并且可读性差得多-将其更改为{{1} }。 - 您的
args
中的for
循环是无用的,因为从未使用过is_fair_game
。 - 要将列表解压缩为许多位置参数,例如
args
变成is_fair_game([1,2,3])
,使用is_fair_game(1,3)
符号。因此,您的代码变为:*
。 **但是,我不建议编写is_fair_game(*args)
来接受可变数量的参数。使用is_fair_game
作为参数的好处是它可以是任意长度,那么为什么首先要拆包呢?尤其是因为在您的代码中,列表就足够了。 - 直接评估布尔值,不要将它们与
list
或False
进行比较。因此True
成为if is_fair_game(*args) == False:
我已经对您的代码进行了一些更改,现在正在按照您要实施的规则运行(如果我正确解释了这些规则)。
我删除了is_fair_game
函数中的循环,因为它既没有循环(它总是在第一个元素中停止),也没有必要。我按照Blckknght的建议在is_fair_game(*player_ranks)
中删除了*。
一路走来,您需要计算平均值,因此我导入了numpy进行计算。
import numpy as np
def is_fair_game(player_ranks):
if len(player_ranks) == 0:
return False
if len(player_ranks) % 2 == 0:
highest = max(player_ranks)
lowest = min(player_ranks)
return highest-lowest <= 5
else:
return False
def matchmaking(**games):
game_on = {}
#insert the keys in the dictionary,and an empty list
for g in games:
game_on[g] = []
for g,args in games.items():
if is_fair_game(args[:]) == False:
game_on[g] = 'not a fair game'
if is_fair_game(args):
for i in args:
if i >= np.mean(args):
game_on[g].append(i)
if len(game_on[g]) == 0:
game_on[g] = 'not a fair game'
return game_on
matchmaking(game_1=[50,49,51,52],game_2=[71,73,71,71],game_3=[18,23,22,18])
我还纠正了其他一些错误,但是您可以检查代码本身。希望能解决这个问题。