在不迭代或使用find()的情况下检查列表中特定项

2 投票
2 回答
1432 浏览
提问于 2025-05-10 23:25

我有一个SteamApp对象的列表:

   >>> games
   [<SteamApp "Counter-Strike: Global Offensive" (730)>, <SteamApp "XCOM: Enemy Unknown" (200510)>]

我还有一段代码:

ownscs = []

if '"Counter-Strike: Global Offensive"' in games:
            print('Owns CS')
            ownscs.append(foo)

我想做的就是检查一下有没有人拥有《反恐精英》。但是问题来了,列表games不能被遍历,也没有find这个属性。如果我尝试这两种方法,就会出现:

if any('"Counter-strike: Global Offensive"' in s for s in games):
TypeError: argument of type 'SteamApp' is not iterable

还有

if games.find('"Counter-strike: Global Offensive"') != -1:
AttributeError: 'SteamApp' object has no attribute 'find'

所以我的问题是:我该如何检查games列表中是否有《反恐精英:全球攻势》,因为它显然既不能遍历也找不到。

我使用的是https://github.com/smiley/steamapi,如果你想知道那是什么,它可以创建SteamApp对象。

相关文章:

  • 暂无相关问题
暂无标签

2 个回答

5

虽然其他回答已经被采纳,但这个替代方案更符合Python的风格,也更接近提问者的尝试:

if 'Counter-strike: Global Offensive' in (s.name for s in games):

注意,s.namestr(s) 得到的结果是一样的,但我觉得使用 name 这个属性会让代码更清晰。

4

你想在一堆 SteamApp 对象中找到一个 str(字符串)。这些 SteamApp 对象其实有一个方法可以和 str() 一起使用,所以这段代码应该可以正常工作:

if "Counter-Strike: Global Offensive" in map(str,games):
            print('Owns CS')
            ownscs.append(foo)

注意,我把单引号去掉了(我觉得没必要),并把 games 改成了 map(str,games)map 会把 str 应用到 games 中的每一个项目,这样就能得到一个只包含游戏名称的游戏列表。你可以用 list(map(str,games)) 来看看这个列表长什么样。

撰写回答