从字典列表中的Python更新值?

时间:2020-07-02 17:55:31

标签: python list dictionary

我正在尝试从字典转换嵌套列表中的值

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]

3 个答案:

答案 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方法往往表现最佳。