2012-07-16 228 views
4

我需要迭代嵌套列表和字典,並用十六進制字符串替換每個整數。這樣的元件例如可以是這樣的: 迭代嵌套列表和字典

element = {'Request': [16, 2], 'Params': ['Typetext', [16, 2], 2], 'Service': 'Servicetext', 'Responses': [{'State': 'Positive', 'PDU': [80, 2, 0]}, {}]} 

後應用功能之後,它應該是這樣的:

element = {'Request': ['0x10', '0x02'], 'Params': ['Typetext', ['0x10', '0x02'], '0x02'], 'Service': 'Servicetext', 'Responses': [{'State': 'Positive', 'PDU': ['0x50', '0x02', '0x00']}, {}]} 

我已經找到了一個功能,迭代此類嵌套迭代器http://code.activestate.com/recipes/577982-recursively-walk-python-objects/。適用於Python 2.5的這個功能看起來是這樣的:

string_types = (str, unicode) 
iteritems = lambda mapping: getattr(mapping, 'iteritems', mapping.items)() 

def objwalk(obj, path=(), memo=None): 
    if memo is None: 
     memo = set() 
    iterator = None 
    if isinstance(obj, dict): 
     iterator = iteritems 
    elif isinstance(obj, (list, set)) and not isinstance(obj, string_types): 
     iterator = enumerate 
    if iterator: 
     if id(obj) not in memo: 
      memo.add(id(obj)) 
      for path_component, value in iterator(obj): 
       for result in objwalk(value, path + (path_component,), memo): 
        yield result 
      memo.remove(id(obj)) 
    else: 
     yield path, obj 

但有了這個功能的問題是,它返回的元組元素。那些不能被編輯。 你能幫我實現一個我需要的功能嗎?

問候 wewa

+0

相關:http://stackoverflow.com/questions/11505304/iterate-over-nested-lists-tuples-and-dictionaries – wewa 2012-07-17 05:18:51

回答

2

的功能不只是返回的元組元素;它將返回嵌套結構中任何項目的路徑以及其值。您可以使用路徑來獲得的值,並將其更改:

for path, value in objwalk(element): 
    if isinstance(value, int): 
     parent = element 
     for step in path[:-1]: 
      parent = parent[step] 
     parent[path[-1]] = hex(value) 

因此,對於每一個是一個整數值,使用路徑來發現價值的父母,然後替換當前值與它的十六進制當量。

你從上面的方法得到的輸出:

>>> element 
{'Params': ['Typetext', ['0x10', '0x2'], '0x2'], 'Request': ['0x10', '0x2'], 'Responses': [{'State': 'Positive', 'PDU': ['0x50', '0x2', '0x0']}, {}], 'Service': 'Servicetext'} 
+0

非常感謝你很多Martijn。 – wewa 2012-07-16 09:38:48

+0

你有膠水如何解決這個問題:http://stackoverflow.com/questions/11505304/iterate-over-nested-lists-tuples-and-dictionaries? – wewa 2012-07-16 14:07:58