2016-02-01 3 views
2

Я пытаюсь вычислить расстояние евклидового среди словарных элементов, как показано нижеевклидова расстояния между словарными элементами

#!/usr/bin/python 

import itertools 
from scipy.spatial import distance 

def Distance(data): 
    for subset in itertools.combinations(data, 2): 
     print subset 
     #This shows a tuple of two element instead of the elements of the dictionary. 
     dst = distance.euclidean(subset) 

if __name__ == "__main__": 

    data = {} 

    data['1'] = [5, 3, 4, 4, 6] 
    data['2'] = [1, 2, 3, 4, 5] 
    data['3'] = [3, 1, 2, 3, 3] 
    data['4'] = [4, 3, 4, 3, 3] 
    data['5'] = [3, 3, 1, 5, 4] 
    Distance(data) 

Проблема в том, что, когда я пытаюсь вычислить комбинацию словарных элементов я получаю то, что я не ожидайте, как прокомментировано в коде. Я думаю, что я делаю что-то неправильно с itertools.combinations ...

ответ

3

Вы принимаете комбинации итерации, а итерация:

for element in data: 
    print(element) 

Если запустить этот код, я думаю, что вы будете см. проблему: вы повторяете ключи словаря, а не элементы. Попробуйте снова с .values():

for subset in itertools.combinations(data.values(), 2): 
    print subset 

У вас есть несколько других вопросов, в вашем коде, хотя: Во-первых distance.euclidean принимает 2 параметра, так что вам нужно сделать что-то вроде этого:

dst = distance.euclidean(*subset) 

.. .Или это ...

dst = distance.euclidean(subset[0], subset[1]) 

... а во-вторых, ваша функция ничего не делает с dst, поэтому он будет перезаписан каждый раз, когда через у наш цикл.

+0

спасибо! Я остановился, потому что результаты не были ожидаемыми. Теперь я могу использовать значение 'dst' для своей цели. Любопытство: в чем смысл передачи '* подмножества' функции? еще раз спасибо! – gaetano

+1

Прохладный - рад, что все получилось! Это способ передачи нескольких параметров. Если у вас есть список или кортеж, вы можете использовать его, чтобы развернуть его до набора аргументов. Если у вас есть словарь, вы можете сделать то же самое с именованными аргументами. Взгляните на эту часть руководства по python: https://docs.python.org/2/tutorial/controlflow.html#more-on-defining-functions –