2013-08-30 1 views
2

Как я могу построить функцию, которая принимает словарь, как: -элементы отображения словаря и нормализовать их

dic = {'a':0.4, 'b':0.2, 'c':0.1, 'd':0.5} 

и список списков: -

l = [['a','red',1],['c','green', 4],['b','blue', 5]] 

Так что я могу сопоставить буквы из списка в словаре и вернуть их значения нормированы, как это:

result = sqrt((0.4^2) + (0.1^2) + (0.2^2)) 

Это моя попытка:

from numpy.linalg import norm 
def normalizing(dic, l1): 
    result = [] 
    for i in dic: 
     if i in l1: 
      result.append(dic[i]) 
    return norm(result) 

возвращения 0.0

Ваша помощь очень ценится!

+0

Можно ли получить l = [["a", "a", 1], ["c", "green", "c"]]? Что вы хотите сделать в этом случае? – Jblasco

+0

Этот код не работает, так как «a» не находится в массиве [['a', 'red', 1], ['c', 'green', 4], ['b', 'blue ', 5]] находится в поддиапазонах. – badc0re

+0

Спасибо, что ты прав! – JPP

ответ

0

Ваш результат дает 0 из-за того, как вы делаете для цикла:

for i in dic: # for every letter in the dictionary 
    if i in l1: # if that letter is one of the elements of the list l1 

я никогда не один из элементов l1 в вашем примере, но [ «а», «красный», 1 ], например. Вы сравниваете одно письмо с этим списком, и, конечно, оно говорит вам, что оно его не находит.

Предполагая, что вы никогда не больше, чем «список в списке», то есть, если вы не должны повторять уровень после того, как уровень с рекурсии, код, который может работать в:

import math 
for letter in dic: 
    for element in l1: 
     if letter in element: 
      result.append(dic[letter]**2 * element.count(letter)) 
return math.sqrt(sum(result)) 
+0

Спасибо! Я забыл упомянуть, что элементы списка списков повторяются, поэтому мой вопрос заключается в том, что условие «если элемент letterin будет работать? – JPP

+0

Нет, если они могут повторяться внутри одного и того же элемента (если вы можете иметь [" a " , "red", "a"], затем см. мое редактирование). – Jblasco

0

Если для массива 'л' элемен ты 'а', 'б', 'с' уникальны вы можете использовать словарь:

def normalizing(dic, l1): 
    result = []  
    for i in dic: 
     if any(i in row for row in l1): 
      result.append(dic[i]) 
    return norm(result) 

    Output: 0.458257569496 
+0

спасибо за ответ, я забыл упомянуть, что элементы не уникальны для массива 'l' – JPP

0
dic = {'a': 0.4, 'c': 0.1, 'b': 0.2, 'd': 0.5} 
l = [['a', 'red', 1], ['c', 'green', 4], ['b', 'blue', 5]] 

import math 

def normalizing(dic, l): 
    result = [] 
    for i in dic: 
     if i in [j[0] for j in l]: 
      result.append(dic[i]) 

    print result #[0.4, 0.1, 0.2] 
    return math.sqrt(sum(k*k for k in result)) 

результата: -

>>>normalizing(dic, l) 
0.45825756949558405 
+1

Excelent let me chk this one to. – JPP