【问题标题】:Python: replace for loop with functionPython:用函数替换for循环
【发布时间】:2018-08-28 11:38:36
【问题描述】:

谁能帮助我了解如何使用def whatever() 创建函数而不是使用for 循环。我正在尝试更多地以 Python 方式做事,但并不真正了解如何很好地应用函数而不是循环。例如,我在下面有一个运行良好的循环并给出了我想要的输出,有没有办法用函数来做到这一点?

seasons = leaguesFinal['season'].unique()
teams = teamsDF['team_long_name'].unique()
df = []

for i in seasons:
    season = leaguesFinal['season'] == i
    season = leaguesFinal[season]
    for j in teams:
        team_season_wins = season['win'] == j
        team_season_win_record = team_season_wins[team_season_wins].count()
        team_season_loss = season['loss'] == j
        team_season_loss_record = team_season_loss[team_season_loss].count()
        df.append((j, i, team_season_win_record, team_season_loss_record))
df = pd.DataFrame(df, columns=('Team', 'Seasons', 'Wins', 'Losses'))

输出如下:

      Team               Seasons    Wins    Losses
0   KRC Genk            2008/2009   15       14
1   Beerschot AC        2008/2009   11       14
2   SV Zulte-Waregem    2008/2009   16       11
3   Sporting Lokeren    2008/2009   13        9
4   KSV Cercle Brugge   2008/2009   14       15

【问题讨论】:

  • 为什么一个简单的循环不应该是“pythonical”?您也可以编写一个循环函数,但在这种情况下可读性不强,您的循环可以很好地理解正在发生的事情。这是 Python 的主要目标之一。
  • hmm.. 您可以使用数据帧 progress_apply 方法来迭代您的数据帧。这肯定会删除一个 for 循环(可能都取决于你如何定义你的函数)以及提高执行速度。
  • 另一个问题:我不明白这段代码如何在第 6 行和第 7 行工作。leaguesFinal['season'] == i 总是返回一个布尔值。在下一行中,您使用这个布尔值作为__getitem__ 的参数。这将导致 KeyError 除非您拥有给定布尔值的键。
  • @SvenKrüger 我不知道为什么它不返回密钥错误?对不起。我猜你对“pythonical”的事情是对的,我正在研究这个,因为我的导师说我使用循环太多,应该尝试更多地使用函数
  • @Cut7er 完美,我会让他知道的;p

标签: python pandas function loops for-loop


【解决方案1】:

解决方案

def some_loop(something, something_else):
    for i in something:
        season = leaguesFinal['sesaon'] == i
        season = leaguesFinal[season]
        for j in something_else:
            team_season_wins = season['win'] == j
            team_season_win_record = team_season_wins[team_season_wins].count()
            team_season_loss = season['loss'] == j
            team_season_loss_record = team_season_loss[team_season_loss].count()
            df.append((j, i, team_season_win_record, team_season_loss_record))

some_loop(seasons, teams)

评论

这就是您所提到的,尽管您仍然有一个 for 循环,但在 for 循环之外创建一个函数,您可以在代码的不同区域使用它而无需重新使用整个代码循环。

所要做的就是定义一个函数,该函数接受这个特定循环的两个变量,即def some_loop(something, something_else),我使用了基本命名,以便您可以更清楚地看到发生了什么。

然后您将用这些变量替换 seasonsteams 的所有实例。

现在您调用您的函数将用您发送给它的任何输入替换所有出现的somethingsomething_else

另外,我不完全确定涉及 x = y = i 的陈述以及它完成了什么,或者它是否是一个有效的陈述?

【讨论】:

  • 谢谢,因为我要求提供一个使我的循环成为函数的示例,我已将其作为已接受的答案,尽管其他人已经解释说这个示例没有必要
  • @55thSwiss 很高兴我能帮上忙!
  • @vash_the_stampede 也许数据框对象已经替换了 __eq__ 方法,这样它就不会返回语句的真值,而是返回该语句为真的元素。
【解决方案2】:

实际上你是在混用 - functions 只是聚合代码行,从而使它们无需重新编写所有内容即可重现,而 for-loops 用于迭代目的。

在您上面提到的示例中,一个函数将只包含 for-loop 并返回结果数据帧,您可以使用它。但它不会改变任何东西或使您的代码更智能。

【讨论】:

  • 感谢您的规范
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 2020-05-07
  • 2015-04-08
  • 1970-01-01
  • 2012-11-06
相关资源
最近更新 更多