在不迭代或使用find()的情况下检查列表中特定项
我有一个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.name
和 str(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))
来看看这个列表长什么样。