2017-02-10 6 views
2

Учитывая следующий список кортежей:Python: отобразить список кортежей на клавишах словаря

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

И следующий словарь:

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

Как я мог бы создать новый список, в котором кортеж содержит ключ в mydict, связанный со значениями самого кортежа?

результат был бы, учитывая два примера выше:

mapped=[(0,25)] 
+0

Что делать, если в словаре несколько клавиш имеют одинаковое значение? –

+0

Это невозможно, так как числа в скобках однозначно идентифицируют точки в пространстве. Таким образом, эти значения имеют географический смысл, и я уделил большое внимание не размещению двух точек в одном месте. – FaCoffee

+2

'l' - это список с 1 элементом, содержащий кортеж кортежей. ожидается? –

ответ

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 для создания наборов внутри как это так LookUp с in быстрее (кортежи неизменны/hashable, так что давайте воспользоваться этим):

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)] 
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)] 
2

Использование словаря в обратном порядке. Быстрый и (в отличие от других решений) сохраняет порядок.

>>> reverse = {v: k for k, v in mydict.items()} 
>>> [tuple(map(reverse.get, sub)) for sub in l] 
[(0, 25)] 
Смежные вопросы