【问题标题】:Check for specific Item in list without Iteration or find()在没有迭代或 find() 的情况下检查列表中的特定项目
【发布时间】:2015-11-24 02:59:09
【问题描述】:

所以我有一个 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)

我只想检查是否有人拥有 Counter-Strike 但问题的关键来了,列表游戏不可迭代且没有属性查找,以防我尝试这两个我得到:

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'

所以我的问题是:我如何查看 Counter-strike: Global Offensive 的列表游戏,因为它显然既不可迭代也不可找到。

如果您想知道 SteamApp 对象是什么,我使用 https://github.com/smiley/steamapi 创建 SteamApp 对象。

【问题讨论】:

  • 你需要知道steamapp对象的属性。试试dir(steamapp)
  • Python list总是可迭代的,所以这不是你的问题。也就是说,您的 games = [...] 行实际上并没有创建一个列表。您是想告诉我们该列表已被初始化为包含两个 SteamApp 对象吗?
  • @KevinJ.Chase 是的,这就是我的意思,甚至不是两个,而是更多!该列表包含每个游戏的 SteamApp 对象。 El'endia 对映射的回答成功了!
  • 您在标题中说 没有迭代,但是迭代列表很好 - 问题是您还试图将 SteamApp 对象视为可迭代的in s.
  • @Galax 是的,我并没有完全理解我面前的东西。我想当它没有迭代器时我可以迭代对象。很抱歉。

标签: python python-3.x steam-web-api


【解决方案1】:

即使其他答案已被接受,但此替代方案更 Pythonic,并且更接近发帖者的尝试:

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

请注意,s.name 与该类的结果与str(s) 相同,但我觉得使用name 属性会增加清晰度。

【讨论】:

    【解决方案2】:

    您试图在SteamApp 对象列表中查找str(字符串)。这些SteamApp 对象实际上定义了一个用于str() 的方法,所以这段代码应该可以工作:

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

    请注意,我去掉了单引号(我认为它们是不必要的)并将games 更改为map(str,games)mapstr 应用于games 中的每个项目,这将生成仅包含游戏名称的游戏列表。发送list(map(str,games)) 以查看该列表的外观。

    【讨论】:

    • 天哪,非常感谢,这成功了,在查看list(map(str,games)) 时,我终于明白了映射的工作原理,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 2021-01-10
    • 2018-03-21
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多