时间:2016-03-12 20:47:56

标签: python list python-2.7 iterator

我有两个列表,listAlistB。两者都包含具有函数get_values的类的实例,该函数返回另一个值列表。

所以,listA包含

[<MyInstance1>, <MyInstance2>, <MyInstance3>]

libstB

[<MyInstance4>, <MyInstance5>, <MyInstance6>]

我可以通过以下方式获取值:

print([x.get_values() for x in listA])

输出:

[
    ['dummy', 'dummy:red', 'dummy'],
    ['dummy', 'dummy:yellow', 'dummy'],
    ['dummy']
]

listB

print([x.get_values() for x in listB])

输出:

[
    ['dummy2', 'dummy2', 'yellow', 'dummy2'],
    ['dummy2', 'dummy2', 'red', 'dummy2'],
    ['dummy2']
]

我想获取一个包含具有相同值的实例对的元组列表,丢弃标记为dummydummy2的值。

值的位置将是相同的,因此对于listA get_values()我只关心第二个元素,而在listB get_values()我只关心第三个元素。

在这种情况下,我会得到:

[
    (<MyInstance1>, <MyInstance5>), # Because they both have "red"
    (<MyInstance2>, <MyInstance4>), # Because they both have "yellow"
    (<MyInstance3>, <MyInstance6>)  # Because they neither have any value
]

我试图避免嵌套,我正在寻找最好的Pythonic和/或优雅方式来处理这个问题。我用itertools或lambdas来猜测。

1 个答案:

答案 0 :(得分:0)

你的最后一个条件对我来说似乎不对,因为你在一个列表中有“dummy”值,而在另一个列表中有“dummy2”值,但这应该满足你的其他条件:

class Blah:
    def __init__(self, vals):
        self.vals = vals

    def get_values(self):
        return self.vals

lst1 = [Blah(['dummy', 'red', 'dummy']),
        Blah(['dummy', 'yellow', 'dummy']),
        Blah(['dummy'])]

lst2 = [Blah(['dummy2', 'dummy2', 'yellow', 'dummy2']),
        Blah(['dummy2', 'dummy2', 'red', 'dummy2']),
        Blah(['dummy2'])]

output = [(item1, item2) for item1 in lst1 for item2 in lst2
          if set(item1.get_values()).intersection(item2.get_values())]