优化从字符串列表中生成一个平面列表,每个字符串都可以评估为一个列表

例如,我将如何最佳地合并:


res_str = ['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']

for example: ['[{'a': u'中国', 'b': u'美国', 'c': u'日本', 'd': u'德国', 'e': u'法国'},]','[{'a': u'中国', 'b': u'美国', 'c': u'日本', 'd': u'德国', 'e': u'法国'},]',] 

进入:


[1,2,3,4,5,6,7,8,9,10,11,12]

我使用了以下代码,但是速度不够快:


[x for j in res_str for x in eval(j)]  spend time 0.65s

list(itertools.chain.from_iterable([eval(i) for i in res_str]))  spend time 0.57s

有没有更好的方法来编写此代码?


除了发电机


(x for j in res_str for x in eval(j))

另一种方式


sum([eval(i) for i in res_str],[]) spend time 3.87s

这边走:


import ast

import itertools

l = ['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']

l = list(itertools.chain(*map(ast.literal_eval, l)))

spend time 0.95s

如果使用eval


list(itertools.chain(*map(eval, res_str)))

spend  time 0.58s

这边走:


eval('+'.join('+'.join(arr)))  spend time 3.5s

这边走:


import ast

import numpy as np

res_str = ['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']

print(list(np.array([ast.literal_eval(i) for i in res_str]).flatten()))

spend time 1s

如果使用eval list(np.array([res_str中i的eval(i)))。flatten())花费时间0.58s


有只小跳蛙
浏览 144回答 3
3回答

心有法竹

使用ast和itertools前任:import astimport itertoolsl = ['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']l = list(itertools.chain(*map(ast.literal_eval, l)))print( l )输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]ast.literal_eval 将字符串元素转换为列表对象itertools.chain 整理清单。

繁星点点滴滴

您可以尝试以下简单方法。>>> arr['[1,2,3]', '[4,5,6]', '[7,8,9]', '[10,11,12]']>>>>>> '+'.join(arr)'[1,2,3]+[4,5,6]+[7,8,9]+[10,11,12]'>>>>>> eval('+'.join(arr))[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]>>>另一种使用reduce()和lambda的方法。>>> import json>>>>>> arr = ['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']>>>>>> arr2 = reduce(lambda list1, list2: list1 + '+' + list2, arr)>>>>>> arr2'[1,2,3]+[4,5,6]+[7,8,9]+[10,11,12]'>>>>>> eval(arr2)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

暮色呼如

ast.literal_eval+ numpy.flatten:import astimport numpy as npres_str = ['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']print(list(np.array([ast.literal_eval(i) for i in res_str]).flatten()))和:import astl = []res_str = ['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']for i in res_str:   l.extend(ast.literal_eval(i))print(l)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python