Python:将元组列表映射到字典的键上

3

给定以下元组列表:

l=[((459301.5857207412, 443923.4365563169),
   (458772.4179957388, 446370.8372844439))]

以下是需要翻译的字典:

mydict={0: (459301.5857207412, 443923.4365563169),
        25: (458772.4179957388, 446370.8372844439)}

我该如何创建一个新的列表,其中元组包含与其值相关联的mydict中的键?

结果将是,给定上面的两个示例:

mapped=[(0,25)]

这是不可能的,因为括号中的数字唯一地标识了空间中的点。因此,这些值具有地理意义,并且我非常注意不在同一位置放置两个点。 - FaCoffee
2
l 是一个包含一个元组的元组列表。是否符合预期? - Jean-François Fabre
顺序重要吗?如果 l 被反转,那么 [(0,25)] 仍然是正确的输出吗? - Stefan Pochmann
“reversed”是什么意思?l是包含元组的列表,而每个元组又包含两个不可分割和不可更改的X、Y坐标。包含这两个小元组的元组是图中的一条边。如果你反转它,你会得到25->0而不是0->25。在我的特定情况下,这不是问题,因为这个链接可以双向工作。在其他情况下,您可能不想混淆这些方向。 - FaCoffee
@CF84 抱歉,我忘记了嵌套,我的意思是如果l[0]被颠倒了,那么怎么办。也就是说,在执行l[0]=l[0][::-1]之后,[(0,25)]是否仍然正确,或者输出是否应该为[(25,0)] - Stefan Pochmann
显示剩余2条评论
4个回答

3

如果

l=[((459301.5857207412, 443923.4365563169),
   (458772.4179957388, 446370.8372844439))]

mydict={0: (459301.5857207412, 443923.4365563169),
        25: (458772.4179957388, 446370.8372844439)}

我可以用这个一行代码来概括你的简单情况:

[tuple(k for k,v in mydict.items() if v in sl) for sl in l]

结果:

[(0, 25)]

注意:为了获得更好的性能,最好预处理 l,创建类似于内部集合的集合,以便使用 in 进行查找更快(元组是不可变/可散列的,因此让我们利用它):

l = [set(x) for x in l]

3
在大多数简单情况下,可以使用常规的for in循环来实现:
mapped = [()]
for k in mydict:
    if mydict[k] in l:
        mapped[0] += (k, )

print(mapped)

输出结果:
[(0, 25)]

3
使用反向词典。快速并且(与其他解决方案不同)保持顺序。
>>> reverse = {v: k for k, v in mydict.items()}
>>> [tuple(map(reverse.get, sub)) for sub in l]
[(0, 25)]

2

这个怎么样?

l = [((459301.5857207412, 443923.4365563169),(458772.4179957388, 446370.8372844439))]
d = {0: (459301.5857207412, 443923.4365563169),
     25: (458772.4179957388, 446370.8372844439)}


mapped = []
for t in l:
    m = []
    for k,v in d.items():
        if v in l[0]:
            m.append(k)
    mapped.append(tuple(m))


>>>print(mapped)
>>>[(0, 25)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接