如何在Python中编写过滤功能

问题描述 投票:0回答:1

我有以下格式的足球比赛清单:

# 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]]

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

  • [HomeTeam是'Bayer 04'和HomeShots + AwayShots> 25
  • AwayTeam是以下其中一种:'RB Leipzig'或'Koln'
  • AwayGoals> HomeGoals

虽然按单个条件过滤列表很简单,例如提取得分超过3个目标的比赛:

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

尚不清楚如何编写一个具有任意数量条件的函数并提取满足所有条件的那些匹配项。

python filter
1个回答
0
投票

您可能想考虑使用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)])]
© www.soinside.com 2019 - 2024. All rights reserved.