python - 如何用Python编写过滤函数

标签 python filter

我有以下格式的足球比赛列表:

# HomeTeam, AwayTeam, HomeScore, AwayScore, HomeShots, AwayShots
[['Bayer 04', 'Werder Bremen', 2, 2, 21, 10]
 ['Paderborn', 'RB Leipzig', 2, 3, 8, 18]
 ['Koln', 'Augsburg', 1, 1, 13, 11]]

假设我只想提取那些满足某些条件的匹配项,例如:

  • 主队是“Bayer 04”,主场射门 + 客场射门 > 25
  • AwayTeam 是以下球队之一:“RB Leipzig”或“Koln”
  • 客场进球 > 主场进球

虽然按单个标准过滤列表很简单,例如提取进球数超过 3 个的比赛:

def moreThan3Goals(matches):
        result = []
        [result.append(match) for match in matches if match[2] + match[3] > 3]
        return result

目前尚不清楚如何编写一个接受任意数量的条件并提取满足所有条件的匹配的函数。

最佳答案

您可能需要考虑使用namedtuple来使函数可读。

from collections import namedtuple

# Convert raw data to list of named tuples.
col_names = ['HomeTeam', 'AwayTeam', 'HomeScore', 'AwayScore', 'HomeShots', 'AwayShots']
Match = namedtuple('Match', col_names)
raw_data = [
    ['Bayer 04', 'Werder Bremen', 2, 2, 21, 10],
    ['Paderborn', 'RB Leipzig', 2, 3, 8, 18],
    ['Koln', 'Augsburg', 1, 1, 13, 11]
]
data = [Match(*m) for m in raw_data]
>>> data
[Match(HomeTeam='Bayer 04', AwayTeam='Werder Bremen', HomeScore=2, AwayScore=2, HomeShots=21, AwayShots=10),
 Match(HomeTeam='Paderborn', AwayTeam='RB Leipzig', HomeScore=2, AwayScore=3, HomeShots=8, AwayShots=18),
 Match(HomeTeam='Koln', AwayTeam='Augsburg', HomeScore=1, AwayScore=1, HomeShots=13, AwayShots=11)]

然后使用 lambda 函数创建任意规则:

rule_1 = lambda m: m.HomeTeam == 'Bayer 04' and (m.HomeShots + m.AwayShots) > 25
rule_2 = lambda m: m.AwayTeam in {'RB Leipzig', 'Koln'}
rule_3 = lambda m: m.AwayScore > m.HomeScore

现在您可以使用条件列表理解来匹配所有规则,将命名元组转换回列表:

[list(m) for m in data 
 if all([rule_1(m), rule_2(m), rule_3(m)])]

或者通过创建规则组:

rule_set_1 = [rule_1, rule_2, rule_3]
[list(m) for m in data 
 if all([rule(m) for rule in rule_set_1])]

关于python - 如何用Python编写过滤函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59145388/

相关文章:

javascript - 如何将 Django 模板变量传递给 WebPack 模块

python - 你如何在 Django 中使用 rauth?

python - 在 Tkinter 中为框架添加标签会忽略框架的属性

excel - VBA:返回超过 2 个过滤条件

javascript - 过滤对象内的数组 javascript

javascript - 获取过滤数组项的索引

java - 无法覆盖或禁用 spring boot 实例化的 Filter,导致过滤器链中出现重复条目

python - Pandas 和积

Python py_compile 到特定目录

Excel:合并 FILTER() 函数输出二维数组中的重复值