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。