自定义Python双列表映射

2024-05-12 22:46:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个对象ID的映射:

mapping = {'id-1':'id-10', 'id-2':'id-14', 'id-3':'id-19'}

和两个包含对象的列表,id是对象的属性,例如object_id1.id = 'id-1'。你知道吗

list1 = [object_id1, object_id3, object_id4, object_id5]
list2 = [object_id19, object_id11, object_id14, object_id10]

我想要一个集合中相关对象的一个列表。例如

output = [(object_id1, object_id10), (object_id2, object_id14),(object_id3, object_id19)]

有可能在一个for循环中完成吗?你知道吗


Tags: 对象id列表属性objectmappingid3id1
2条回答

不能在单个for循环中执行,但可以在两个(不是嵌套的)循环中执行:

>>> mapping = {'id-1': 'id-10', 'id-2': 'id-14', 'id-3': 'id-19'}
>>> list1 = [object_id1, object_id3, object_id4, object_id5]
>>> list2 = [object_id19, object_id11, object_id14, object_id10]

通过list2中的id构造查找dict以查找项:

>>> lookup_dict = {item.id: item for item in list2}

然后你可以简单地做:

>>> output = [(item, lookup_dict[mapping[item.id]]) for item in list1 if mapping[item.id] in lookup_dict]

编辑:修正了我对问题的误解,部分改编自: Searching a list of objects in Python

假设list1和list2之间没有重复项,并且总是找到匹配项

这可能适用于此,我尚未对此进行测试,因此您可能会发现一些语法错误:

for item in map:
   xResult = [x for x in list1 if x.id == item or x.id == map[item]][0]
   yResult = [y for y in list2 if y.id == item or y.id == map[item]][0]
   if item == xResult:
       firstTupleItem = xResult
       secondTupleItem = yResult
   else:
       firstTupleItem = yResult
       secondTupleItem = xResult
   tuple = (firstTupleItem,secondTupleItem)
   output.append(tuple)

当然,这可能会得到很大的优化或改进,但这可能是一个合理的起点

编辑:塞尔库克的答案是比较理想的,但我会保持这个参考的缘故

相关问题 更多 >