Python 通过两个列表中的特定键值组合两个列表的优雅方式

Python 通过两个列表中的特定键值组合两个列表的优雅方式,python,list,python-2.7,iterator,Python,List,Python 2.7,Iterator,我有两个列表,listA和listB。两者都包含一个类的实例,该类具有函数get\u values,该函数返回另一个值列表 因此,listA包含 [<MyInstance1>, <MyInstance2>, <MyInstance3>] 我可以通过以下方式获得值: print([x.get_values() for x in listA]) 输出: [ ['dummy', 'dummy:red', 'dummy'], ['dummy', '

我有两个列表,
listA
listB
。两者都包含一个类的实例,该类具有函数
get\u values
,该函数返回另一个值列表

因此,
listA
包含

[<MyInstance1>, <MyInstance2>, <MyInstance3>]
我可以通过以下方式获得值:

print([x.get_values() for x in listA])
输出:

[
    ['dummy', 'dummy:red', 'dummy'],
    ['dummy', 'dummy:yellow', 'dummy'],
    ['dummy']
]
[
    ['dummy2', 'dummy2', 'yellow', 'dummy2'],
    ['dummy2', 'dummy2', 'red', 'dummy2'],
    ['dummy2']
]
对于
listB

[<MyInstance4>, <MyInstance5>, <MyInstance6>]
print([x.get_values() for x in listB])
输出:

[
    ['dummy', 'dummy:red', 'dummy'],
    ['dummy', 'dummy:yellow', 'dummy'],
    ['dummy']
]
[
    ['dummy2', 'dummy2', 'yellow', 'dummy2'],
    ['dummy2', 'dummy2', 'red', 'dummy2'],
    ['dummy2']
]
我想得到一个元组列表,其中包含一对具有相同值的实例,丢弃标记为
dummy
dummy2
的值

值的位置将是相同的,因此对于
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
]
[
(,),#因为他们都有“红色”
(,),#因为他们都有“黄色”
(,)#因为它们都没有任何价值
]

我试图避免嵌套的for,我正在寻找最具python风格和/或优雅的方式来处理这个问题。我对itertools或lambdas进行了一些猜测。

我觉得您的最后一个条件不合适,因为一个列表中的值为“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())]

这是一个嵌套的for,但是使用数组理解,对吗?有一种想法似乎我没有正确地表达出来,那就是listA中的一个元素具有我正在寻找的值作为该值的一部分,如
dummy:red
。如果值完全相同,交叉点应该可以工作,对吗?还要感谢你指出我问题中的错误:我也不关心dummy2。