2

我有一个列表列表,并将对其进行搜索,只会产生一个结果。以下代码有效,但不直观,因为它并没有真正表达我正在尝试做的事情的意图......看起来我正在尝试返回一个列表,只是碰巧想要返回第一个最后一个项目:这不是真的,因为我总是只想要一个项目,而不是一个列表。这里有什么更直观的吗?

game = [g for g in games if g.num==5 and re.search("ucla", g.a_name, re.I)][0]
4

2 回答 2

3

遗憾的是,Python 中没有内置方法可以使用辅助函数在列表中进行搜索。

但是,您可以使用生成器表达式并使其在第一次匹配时停止,而不是在迭代剩余列表时停止,即使已经找到匹配项也是如此。

game = next(g for g in games if g.num==5 and re.search("ucla", g.a_name, re.I))

或者可能更实用的方法(这不等同于 Python 2.x 上的前一个方法,因为它生成整个列表,并且不会在第一个匹配元素处停止。在 Python 3.x 上filter返回一个迭代器并且行为是相同的)。

game = next(filter(lambda g: g.num==5 and re.search("ucla", g.a_name, re.I), games))

过滤器是否更清晰是一个偏好问题。BDFL 更喜欢理解。

于 2013-09-26T10:00:14.493 回答
1
list_games = [g for g in games if g.num==5 and re.search("ucla", g.a_name, re.I)]
game = list_games[0]

您可以将该列表的第一个元素显式分配给您的变量游戏。这使它更清楚一些。

于 2013-09-26T09:59:47.367 回答