Python:从** args获取列表以在for循环中运行

问题描述

我正在尝试运行一个函数,该函数采用一个玩家等级列表,以创建一个字典(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

解决方法

  1. args[0:len(args)]args始终是同一件事(在您的情况下-因为您没有修改args),并且可读性差得多-将其更改为{{1} }。
  2. 您的args中的for循环是无用的,因为从未使用过is_fair_game
  3. 要将列表解压缩为许多位置参数,例如args变成is_fair_game([1,2,3]),使用is_fair_game(1,3)符号。因此,您的代码变为:*。 **但是,我不建议编写is_fair_game(*args)来接受可变数量的参数。使用is_fair_game作为参数的好处是它可以是任意长度,那么为什么首先要拆包呢?尤其是因为在您的代码中,列表就足够了。
  4. 直接评估布尔值,不要将它们与listFalse进行比较。因此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])

我还纠正了其他一些错误,但是您可以检查代码本身。希望能解决这个问题。