【问题标题】:Python if Statement not finding valuePython if 语句没有找到价值
【发布时间】:2012-11-28 22:11:58
【问题描述】:

我已经构建了自己的类User,它具有userID 的属性。我覆盖了__repr__,使其成为userID 字符串。

在另一个类中,我有一个数组 self.users = [] 和几个 User 实例。出于测试目的,我给了他们用户 ID 1 和 2。我使用:

'[%s]' % ','.join(map(str, self.users))

要打印数组的内容,产生:

[1,2]

我正在尝试按照以下方式进行 if 语句:

if "1" in self.users:
  print "True"

以上是我想要实现的目标的简单表示。我尝试了很多方法,但我无法让程序打印出来。有谁知道怎么做?

【问题讨论】:

  • self.users 中的值是 int 吗?因为您正在检查字符串'1'
  • 他将 str 构造函数映射到列表上。这不是问题。
  • 出于好奇,您为什么要将str 映射到列表上?通常人们这样做是为了避免list.__str__ 在每个元素上调用__repr__ 的事实——但在您的情况下,您已经定义了__repr__,并且您正在专门寻找__repr__ 值……
  • 我们只是在猜测self.users 中的元素是什么。我们知道他们已经很好地定义了__str__/__repr__,但仅此而已。为了提供更好的解决方案,您应该在 if 语句之前插入 print self.users 并将结果作为对您问题的编辑发布
  • 是否有理由需要通过字符串表示而不是实际的成员变量进行搜索?为什么不只是any(user.userID == '1' for user in self.users)

标签: python if-statement boolean


【解决方案1】:

你想要吗:

if any("1" in str(x) for x in self.users):
   print "True"

可能更好的是:

if any("1" == x.userID for x in self.users):
   print True

如果我没看错你的帖子。


最后,根据User 的API,您可以在相等测试中使用ID

class User(object):
    def __eq__(self,other):
       return self.userID == other
   #other methods here

现在您可以在您的列表中使用__contains__ (in),就像您最初尝试做的那样:

if "1" in self.users:
   print "True"

【讨论】:

  • 正如我对 Blender 所说的,鉴于他的定义是 __repr__ 而不是 __str__,我会在这里使用 repr(x)
  • @abarnert——也许吧。 __str__ 默认调用 __repr__ ......(我认为 str 是这里真正应该使用的。我认为 OP 应该重新考虑以这种方式覆盖 __repr__ 的决定)
  • 是的,假设他也没有定义(或者以后没有定义)。正如 Blender 指出的那样,首先将他的 __repr__ 更改为 __str__ 可能会更好。但无论哪种方式,我认为搜索您确定定义的那个是有意义的……
【解决方案2】:

"1" in self.users 检查字符串"1" 是否在列表self.users 中。您正在尝试检查是否存在字符串表示为 "1" 的用户,因此您可以尝试以下操作:

if '1' in map(str, self.users):
    print 'True

另外,我会在你的类定义中将 __repr__ 更改为 __str__

__repr__ 通常会返回一个字符串,该字符串可以将eval() 转换回原始对象,而__str__ 返回对象的人类可读表示。你正在做后者,所以我建议你使用__str__ 而不是__repr__

我也读过这个问题:Difference between __str__ and __repr__ in Python

【讨论】:

  • 鉴于他的定义是 __repr__ 而不是 __str__,我会在这里使用 repr 而不是 str
  • itertools.imap 在这里更好,因为它更适合短路
  • 是的,我认为一般来说这是一个更合理的解决方法。特别是,他选择在列表上映射str 而不是repr,这意味着无论如何他实际上希望这是str 表示。
【解决方案3】:

根据您的问题定义,听起来您正在尝试查找是否有任何用户 ID 属性为“1”的用户。

您的__repr__ 函数恰好使用userID 作为表示的事实确实意味着这是搜索它的最佳方式。为什么不只是这个?

if any(user.userID == '1' for user in self.users):
    print "True"

如果您确实需要搜索字符串表示,当然,请使用 mgilson 或 Blender 发布的答案(并找出您想要的 strrepr 中的哪一个)。但如果没有必要,请不要这样做。

【讨论】:

    猜你喜欢
    • 2022-11-05
    • 2021-11-30
    • 1970-01-01
    • 2020-08-07
    • 2021-07-25
    • 2011-11-29
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多