【问题标题】:trying to find if a string is in a list of objects尝试查找字符串是否在对象列表中
【发布时间】:2017-12-14 12:35:16
【问题描述】:

我不确定这是否可能,因为无法在线查找和回答,可能是因为我不知道必须解决这个问题。所以下面的代码是我正在尝试做的一个基本示例。

class Names():
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return self.name

>>> i = []
>>> i.append(Names("bob"))
>>> i.append(Names("jill"))
>>> i
[bob, jill]
>>> "bob" in i
False

我有一个 Name 类的列表,如果其中已经存在名称,我想返回 True。如果知道我怎样才能让它工作?

【问题讨论】:

  • print([type(h) for h in i]),你就会明白为什么False会被返回。或者只是注意到没有引号(bob.vs.'bob'
  • 看这个话题在这里你可以找到你的答案:stackoverflow.com/questions/3435089/…
  • @KrzysztofPacholski 语言错误?

标签: python


【解决方案1】:

有几种方法可以做到这一点。

最简单的方法是使用any 进行迭代:

any(item.name == 'bob' for item in i)

更复杂的版本是在你的类上定义一个__eq__ 方法:

def __eq__(self, val):
    return self.name == val

现在您原来的"bob" in i 代码可以使用了。

(对于真正的代码,如果您在两个名称实例之间,您可能希望签入该方法,而不是使用字符串。)

【讨论】:

【解决方案2】:

您可以遍历您的列表并根据您的字符串检查每个对象的 .name 属性。

>>> any('bob' == j.name for j in i)
True

【讨论】:

  • 我不得不想象有一种更面向 OOP 的方式来做到这一点,通过在某处重载一些魔法方法......
  • 有,但我倾向于谨慎对待我允许定义平等的程度。我倾向于通过检查它们的某些属性子集来保留两个对象之间的相等性
【解决方案3】:

指出更多细节。

当你问

"bob" in i

您正在询问字符串 "bob" 是否在列表中。 即使你问如果

Names("bob") in i

你得到 False 因为那个确切的对象不在列表中。

如果您想将Names 与相同的name 视为相同,您可以在类中添加__eq__ 方法:

class Names():
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return self.name
    def __eq__(self, other):
        return self.name == other.name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多