我有一个类‘Foo’,它有一个名称(字符串)和一组数据(整数列表)。我需要能够根据Foo的列表找到“test”任何字符串/列表组合,以找到任何匹配项。这样地:

class Foo:
    def __init__(self, name, data):
        self.name = str(name)
        self.data = list(data)


foo1 = Foo('abc', [1, 2, 3])
foo2 = Foo('def', [4, 5, 6])
foo3 = Foo('ghi', [7, 8, 9])

my_list = [foo1, foo2, foo3]

def test(name, data):
    results = []
    for foo in my_list:
        if foo.name == name:
            for number in data:
                if number in foo.data:
                    results.append(number)
    return name, results

print test('def', [2, 3, 4, 5])

会回来的
('def', [4, 5])

当。。。
print test('gah', [1, 2, 3])

会回来的
('gah', [])

这基本上是可行的,但看起来有点傻。我希望有一种方法可以使用列表理解或生成器使它更漂亮。我并不一定要把所有的东西都简化成一个单行表达式,因为我认为这几乎是不可能阅读的,但我怀疑有更好的方法来做到这一点。

最佳答案

看起来您可以重新构造代码中的一些内容,使其工作得更好。
首先,我会考虑一个集合,而不是将数据作为一个列表。这将允许您使用data.intersection(otherdata)获得重叠。
接下来,不是Foo实例的列表,而是一个由它们的名字键入的字典?这将允许您根据测试名称对其进行索引,而不必循环遍历实例列表以找到合适的实例。

class Foo:
    def __init__(self, name, data):
        self.name = str(name)
        self.data = set(data)


foo1 = Foo('abc', [1, 2, 3])
foo2 = Foo('def', [4, 5, 6])
foo3 = Foo('ghi', [7, 8, 9])

my_lookup = dict((f.name, f) for f in [foo1, foo2, foo3])

def test(name, data):
    if name in my_lookup:
        return name, my_lookup[name].data.intersection(data)
    return name, []

我意识到,如果你测试了一个你没有的名字,你会得到一个KeyError,所以我对它进行了适当的调整。

关于python - 在列表属性,类实例列表中查找匹配项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8086069/

10-12 01:07
查看更多