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

时间:2017-02-10 13:49:37

标签: python list dictionary mapping

给出以下元组列表:

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

以下词典:

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

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

鉴于以上两个例子,结果将是:

mapped=[(0,25)]

4 个答案:

答案 0 :(得分:3)

如果

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

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

我想我可以用这个oneliner概括你的简单案例:

[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]

答案 1 :(得分:3)

在大多数情况下,可以使用常规for in循环来实现:

mapped = [()]
for k in mydict:
    if mydict[k] in l:
        mapped[0] += (k, )

print(mapped)

输出:

[(0, 25)]

答案 2 :(得分: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)]

答案 3 :(得分:2)

使用反向字典。快速(与其他解决方案不同)保持秩序。

>>> reverse = {v: k for k, v in mydict.items()}
>>> [tuple(map(reverse.get, sub)) for sub in l]
[(0, 25)]