我正在尝试从dict中转换嵌套列表中的值
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]
发布于 2020-07-02 18:12:12
另一种方法是只使用map:
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
map法= 0.000001440 s
map法变分= 0.000001180 s
有一个大得多但类似的列表,大约:
嵌套列表理解= 0.054890156 s
map法= 0.050899744 s
map法变分= 0.065859318 s
因此,我想最有效的解决方案(从提供的方案)取决于您实际列表的大小,似乎map方法在列表变得更大时执行得最好。
发布于 2020-07-02 17:58:14
使用二级列表理解。
result = [[dict_form[k] for k in sublist] for sublist in list1]
print(result) # [['app', 'bold'], ['cafe'], ['app', 'dot']]
200 k迭代的20个循环上的Timeit
# 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
所以在正常的列表长度上表现更多,在巨大的列表上也是如此(见德里克·波斯特)
发布于 2020-07-02 18:11:52
下面是如何使用嵌套列表理解:
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']]
https://stackoverflow.com/questions/62702366
复制相似问题