2016-02-09 3 views
-3

Как я могу прочитать список внутри словаря и попытаться изменить номера строк на цифры? Например:Как читать словарь со списком?

obj = {'azul':'4','rojo':[{'rojo_a':'1','rojo_b':'2'}],'amarillo':'xxx','naranja':[{'naranja_1':'1','naranja_2':'2'}]} 

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

{k:int(v) if v.isdigit() else v for k,v in obj.items()} 

Но это не работает, так что я пытался что-то вроде этого:

for objs in obj: 
if objs.isdigit(): 
    k:int(v) 
else: 
    for k,v in objs.items(): 
     print k 

Но это терпит неудачу.

+1

Можете ли вы показать нам именно то, что вы хотите, чтобы вывод ДИКТ выглядеть, учитывая ваш вклад? – glibdud

+0

Я думаю, вы хотите '{k: int (v) if isinstance (v, str) и v.isdigit() else v для k, v в obj.items()}' – Lol4t0

+0

@ Lol4t0 ... Я думаю, они хотят поведение для рекурсии в подвыборах и подсписок ... –

ответ

4

это кажется хорошей проблемой для рекурсии

obj = {'azul':'4','rojo':[{'rojo_a':'1','rojo_b':'2'}],'amarillo':'xxx','naranja':[{'naranja_1':'1','naranja_2':'2'}]} 
def fix_ints(obj): 
    if isinstance(obj,basestring): 
     try: 
      return int(obj) 
     except ValueError: 
      print "I cant Make %r an int"%obj 
      return obj 
    elif isinstance(obj,(list,tuple)): 
     return [fix_ints(item) for item in obj] 
    elif isinstance(obj,dict): 
     return dict((key,fix_ints(value)) for key,value in obj.items()) 
    else: 
     print "I have no idea what to do with %r"%obj 

new_obj = fix_ints(obj) 
print new_obj 

Обратите внимание, что питон не поддерживает хвостовую рекурсию, так что, если эта структура данных идет очень глубоко (более 1k уровней вложенности), то рекурсия не может быть целесообразна. ..

грубой вы также можете сделать серпантин трюки с ним

import json,re 
new_obj = json.loads(re.sub("\"(\d+)\"","\\1",json.dumps(obj))) 

(хотя на самом деле вы должны сделать это, как я делаю в моем первом е xzample ... этот второй метод действительно просто для удовольствия)

+1

Я только что закончил свою версию с той же рекурсией, но вы были быстрее ... xP – pekapa

+0

Возвращает 'None', если в одном из этих списков есть' dict' внутри 'dict'! Я все равно пойду за свое решение: p Хотя я должен признать, что ваш довольно элегантный и выполняет эту работу в этом контексте. – Pouria

+0

jajaja wow amazin, но у меня возникла проблема: если у меня есть obj с False, он станет нулевым или поплавком, как 4.00 тоже не станет. Спасибо Joran Beasley –

0

Строки номера:

def int_it(obj): 
    if obj.isdigit(): 
     obj = int(obj) 

    return obj 

Dict на номер (независимо от количества вложенной dicts или списков):

class Convert(object): 
    def __init__(self, obj): 
     self.obj = obj 

     if isinstance(obj, dict): 
      self.handle_dict(obj) 

    def handle_dict(self, obj): 
     for key, value in obj.items(): 
      if isinstance(value, str) and value.isdigit(): 
       self.obj[key] = int_it(value) 

      elif isinstance(obj[key], list): 
       ins = HandleList(obj[key]) 
       self.obj[key] = ins.obj 

      elif isinstance(obj[key], dict): 
       ins = Convert(obj.items()) 
       self.obj[key] = ins.obj 

     return obj 

Список номеров, независимо от количества вложенных списков или dicts.

class HandleList(object): 
    def __init__(self, obj): 
     self.obj = obj 
     self.handle_list(obj) 

    def handle_list(self, obj): 
     for index, item in enumerate(obj): 
      if isinstance(item, list): 
       obj.index(index, [HandleList(val).obj for val in item]) 

      elif isinstance(item, str): 
       obj.index(index, int_it(item)) 

      elif isinstance(item, dict): 
       Convert(item) 

     return obj 


output = Convert(values) 

print(output.obj) 

Возвращает:

{ 
    'amarillo': 'xxx', 
    'naranja': [{'naranja_1': 1, 'naranja_2': 2}], 
    'rojo': [{'rojo_b': 2, 'rojo_a': 1}], 
    'azul': 4 
} 

Учитывая вход:

values = { 
    'azul':'4', 
    'rojo': [ 
      {'rojo_a':'1', 
      'rojo_b':'2' 
      } 
      ], 
    'amarillo':'xxx', 
    'naranja': [ 
       {'naranja_1':'1', 
       'naranja_2':'2' 
       } 
       ] 
    } 
Смежные вопросы