2015-01-24 3 views
-1

Я получаю эту ошибку, и я думаю, что я потратил на нее 5 часов. Пожалуйста, помогите кому-нибудь. В конечном итоге я хочу получить значения из этого. Что вызывает много ценностей? Это мои строковые значения или настройка самого словаря.Я продолжаю получать постоянный ValueError: слишком много значений для распаковки, и я не понимаю, почему

import ast 
# -*- coding: utf-8 -*- 
class MyMetric: 
    def __init__(self, name): 
     self.name = name 

     self.metric_system = { 
         "yotta": ("Y", str(10^24)), 
         "zetta": ("Z", str(10^21)), 
         "exa": ("E", str(10^18)), 
         "peta": ("P", str(10^15)), 
         "tera": ("T", str(10^12)), 
         "giga": ("G", str(10^9)), 
         "mega": ("M", str(10^6)), 
         "kilo": ("k", str(10^3)), 
         "hecto": ("h", str(10^2)), 
         "deka": ("da", str(10^1)), 
         "deci": ("d", str(10^-1)), 
         "centi": ("c", str(10^-2)), 
         "milli": ("m", str(10^-3)), 
         "micro": ("μ", str(10^-6)), 
         "nano": ("n", str(10^-9)), 
         "pico": ("p", str(10^-12)), 
         "femto": ("f", str(10^-15)), 
         "atto": ("a", str(10^-18)), 
         "zepto": ("z", str(10^-21)), 
         "yocto": ("y", str(10^-24)) 
         } 

    def __str__(self): 
     for key,val in self.metric_system: 

      self.metric_name = key 
      self.metric_symbol = val[0] 
      self.metric_value = val[1] 

      if self.name == self.metric_name: 
       print ("it is there") 



me = MyMetric("milli") 
print(me) 
+1

'для ключа, Вэл в self.metric_system' ->' для key, val in self.metric_system.items() ' – vaultah

+0

'^'не является оператором' power-of', это побитовый оператор 'XOR'. '2^5 = 7', потому что' 0010 XOR 0101 = 0111'. Правильный оператор - '**'. '2 ** 5 = 32' –

ответ

1

LOOPING над словарем дает только ключи. Используйте dict.items() method, когда вы хотите, и ключ и значение:

for key, val in self.metric_system.items(): 

Из dict() documentation:

iter(d)
Return an iterator over the keys of the dictionary. This is a shortcut for iter(d.keys()) .

for петля использует iter() на детале накинут, внутренне.

Обратите внимание, что __str__ ожидается Строка, а не печать.

Однако в итерации по всем значениям в словаре есть мало смысла, когда у вас уже есть ключ. Вы можете просто сделать:

def __str__(self): 
    if self.name in self.metric_system: 
     return "it is here" 
    return "it is not here" 

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

def __str__(self): 
    try: 
     symbol, magnitude = self.metric_system[self.name] 
    except KeyError: 
     return 'Unknown metric {}'.format(self.name) 
    return 'Metric {} ({}, {})'.format(self.name, symbol, magnitude) 

Демо:

>>> print(MyMetric("milli")) 
Metric milli (m, -9) 
>>> print(MyMetric("foobar")) 
Unknown metric foobar 
0

Ваш цикл должен быть

for key,val in self.metric_system.items(): 

Это перебирать пары (key, value)

Смежные вопросы