【问题标题】:simpler way for getting data from dictionary从字典中获取数据的更简单方法
【发布时间】:2021-05-31 19:42:35
【问题描述】:

我有一本字典: 元组的最后一个条目是射门的分钟数。 例如:巴西球员奥斯卡第90分钟射门

players = {
    "Brazil": [
        (12, "Júlio César", "Goalkeeper", []),
        (4, "David Luiz", "Defender", []),
        (6, "Marcelo", "Defender", []),
        (13, "Dante", "Defender", []),
        (23, "Maicon", "Defender", []),
        (5, "Fernandinho", "Midfielder", []),
        (7, "Hulk", "Midfielder", []),
        (8, "Paulinho", "Midfielder", []),
        (11, "Oscar", "Midfielder", [90]),
        (16, "Ramires", "Midfielder", []),
        (17, "Luiz Gustavo", "Midfielder", []),
        (19, "Willian", "Midfielder", []),
        (9, "Fred", "Striker", []),
    ],
    "Germany": [
        (1, "Manuel Neuer", "Goalkeeper", []),
        (4, "Benedikt Höwedes", "Defender", []),
        (5, "Mats Hummels", "Defender", []),
        (16, "Philipp Lahm", "Defender", []),
        (17, "Per Mertesacker", "Defender", []),
        (20, "Jérôme Boateng", "Defender", []),
        (6, "Sami Khedira", "Midfielder", [29]),
        (7, "Bastian Schweinsteiger", "Midfielder", []),
        (8, "Mesut Özil", "Midfielder", []),
        (13, "Thomas Müller", "Midfielder", [11]),
        (14, "Julian Draxler", "Midfielder", []),
        (18, "Toni Kroos", "Midfielder", [24, 26]),
        (9, "André Schürrle", "Striker", [69, 79]),
        (11, "Miroslav Klose", "Striker", [23]),
    ],
}

我想创建一个函数,将球队和一分钟作为输入,并返回该分钟的射门数。 我试过这样:

def score_at_minute(team,minute):
    global players
    goals = [goals for (number, player, position, goals) in players[team] if len(goals)>=1]
    goals_1 = [goal[0] for goal in goals if len(goal)>=1 if goal[0] <= minute]
    goals_2 = [goal[1] for goal in goals if len(goal) ==2 if goal[1]<= minute]
    all_goals = goals_1+goals_2
    return len(all_goals)

我的函数调用如下所示:

score_at_minute("Germany",90)

有没有更简单的方法或最好的方法?

【问题讨论】:

  • (12, "Júlio César", "Goalkeeper", [])这些是什么,请描述一下
  • 这被 OP 描述为:(number, player, position, goals)
  • 目标是被射门的分钟数。我编辑了我的帖子
  • 如果这是您认为可以改进的工作代码,请参阅Code Review。如果没有,请给minimal reproducible example说明具体问题。
  • 是的,这段代码有效。

标签: python list dictionary list-comprehension dictionary-comprehension


【解决方案1】:

您可以简单地使用列表推导

# For Germany
# For less than 90 minutes
len([eg for _,_,_,g in players['Germany'] for eg in g if eg<90])
7

【讨论】:

    【解决方案2】:

    这个怎么样-

    def score_at_minute(x,y):
        return len([j for i in players.get(x) for j in i[3] if j<=y])
    
    score_at_minute("Germany",25)
    
    3
    

    另一个版本-

    score_at_minute = lambda x,y: len([j for i in players.get(x) for j in i[3] if j<=y])
    
    score_at_minute('Germany', 90)
    
    7
    

    这是如何工作的 -

    1. players.get(x)获取国家x下的球员和进球列表
    2. i[3] 是包含目标列表的项目
    3. 当迭代它时,您最终会得到一个列表列表,其中每个子列表都包含目标。 [[],[],[],[24],[32,45]] .. 等
    4. 您现在可以使用[item for sublist in list for item in sublist] 展平列表列表
    5. 然后您可以在此列表上应用过滤器(小于等于输入分钟数)
    6. 最后算出长度。

    【讨论】:

    • 谢谢。我尝试了双重列表理解,但这对我不起作用。你能解释一下吗?
    • 什么意思?这不适合你吗?因为这是一个单一的列表理解
    • 我会添加解释。
    • 更新了我的答案
    • 是的,它有效,但理解中有两个 for 语句,但现在我明白了
    【解决方案3】:

    使用items()

    def score_at_minute(team,minute):        
        for key,val in players.items():
            if key==team:            
                return(len([j for i in val  for j in i[3] if j <=minute]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多