2017-02-23 74 views
1

我有一个嵌套列表:在Python中用dict替换嵌套列表中的值?

my_list = ['a','b','c','dog', ['pig','cat'], 'd'] 

和字典:

my_dict = {'dog':'c','pig':'a','cat':'d'} 

我想用的字典,这样我得到一个列表:

new_list = ['a', 'b', 'c', 'c', ['a', 'd'], 'd'] 

我我试过类似的东西:

new_list = [] 
for idx1, item1 in enumerate(my_list): 
    for idx2, item2 in enumerate(item1): 
     new_list[idx1][idx2] = my_dict[item2] 

但是当item2不存在于dict中时出现错误。有一个更好的方法吗?

回答

5

你可以编写一个简单的递归函数,使用列表理解来生成结果。如果你的清单上的项目是一个列表,然后递归,否则使用dict.get使用默认参数的项目转换:

my_list = ['a','b','c','dog', ['pig','cat'], 'd'] 
my_dict = {'dog':'c','pig':'a','cat':'d'} 

def convert(l, d): 
    return [convert(x, d) if isinstance(x, list) else d.get(x, x) for x in l] 

print(convert(my_list, my_dict)) 

输出:

你想替换成
['a', 'b', 'c', 'c', ['a', 'd'], 'd'] 
1

你看升艾克嵌套列表。试试这个功能,这将递归地交换值您:

def replace_vals(_list, my_dict): 
    new_list = [] 
    for item in _list: 
     if isinstance(item, list): 
       new_list.append(replace_vals(item, my_dict)) 
     elif item in my_dict: 
      new_list.append(my_dict.get(item)) 
     else: 
      new_list.append(item)  
    return new_list 

print replace_vals(my_list, my_dict) 
0
my_list = ['a','b','c','dog', ['pig','cat'], 'd'] 
my_dict = {'dog':'c','pig':'a','cat':'d'} 


def replace(item): 
    if item in my_dict: 
     return my_dict[item] 
    else: 
     return item 
new_list=[]; 
for item in my_list: 
    if isinstance(item,list): 
     temp_list=[] 
     for subitem in item: 
      temp_list.append(replace(subitem)) 
     new_list.append(temp_list) 
    else: 
     new_list.append(replace(item)) 
print new_list 

如果里面my_list列表嵌套在自己这段代码将无法正常工作。