我正在尝试从字典转换嵌套列表中的值
list1 = [["a","b"],["c"],["a","d"]]
list2 = [["a","b"],["c"],[""],["a","d"]]
dict_form = {"a":"app","b":"bold","c":"cafe","d":"dot"}
预期产量
new_list = [["app","bold"],["cafe"],["app","dot"]]
result_1 = [["app","bold"],["cafe"],[""],["app","dot"]]
我尝试过的事情:
result = [[dict_form[i] for i in j] for j in new_list]
答案 0 :(得分:4)
使用2级列表理解
result = [[dict_form[k] for k in sublist] for sublist in list1]
print(result) # [['app', 'bold'], ['cafe'], ['app', 'dot']]
Timeit
进行20个200k迭代的循环
# List comprehension : [[dict_form[k] for k in sublist] for sublist in list1]
python -m timeit -r 20 -n 200000 -s "list1 = [['a','b'],['c'],['a','d']];dict_form = {'a':'app','b':'bold','c':'cafe','d':'dot'}" "[[dict_form[k] for k in sublist] for sublist in list1]"
200000 loops, best of 20: 1.74 usec per loop
# list/map : list(map(lambda x: list(map(dict_form.get, x)), list1))
python -m timeit -r 20 -n 200000 -s "list1 = [['a','b'],['c'],['a','d']];dict_form = {'a':'app','b':'bold','c':'cafe','d':'dot'}" "list(map(lambda x: list(map(dict_form.get, x)), list1))"
200000 loops, best of 20: 3.2 usec per loop
在正常的列表长度上,性能更高,而在巨大的列表上,性能相同(请参见Derek帖子)
答案 1 :(得分:0)
以下是使用嵌套列表推导的方法:
list1 = [["a","b"],["c"],["a","d"]]
dict_form = {"a":"app","b":"bold","c":"cafe","d":"dot"}
new_list = [[dict_form[k] for k in ls] for ls in list1]
print(new_list)
输出:
[['app', 'bold'], ['cafe'], ['app', 'dot']]
答案 2 :(得分:0)
另一种方法是只使用地图:
list(map(lambda x: list(map(dict_form.get, x)), list1))
输出:
[['app', 'bold'], ['cafe'], ['app', 'dot']]
轻微变化:
[*map(lambda x: [*map(dict_form.get, x)], list1)]
作为@azro计时的后续工作,我生成了一个更大的具有相同类型结构的输入list1。
使用来自OP的当前输入,大约:
嵌套列表理解= 0.000000833 s
地图方法= 0.000001440 s
地图方法的变化= 0.000001180 s
具有更大但相似的列表,大约:
嵌套列表理解= 0.054890156 s
地图方法= 0.050899744 s
地图方法的变化= 0.065859318 s
因此,我想最有效的解决方案(来自提供的解决方案)取决于您实际列表的大小,随着列表变大,似乎map方法往往表现最佳。