优化从每个字符串都可评估为列表的字符串列表制作平面列表

时间:2018-06-22 07:00:37

标签: python performance optimization

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

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.58秒

7 个答案:

答案 0 :(得分:1)

使用astitertools

例如:

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)))
print( l )

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
  • ast.literal_eval将字符串元素转换为列表对象
  • itertools.chain将列表弄平。

答案 1 :(得分:0)

如果您希望在不使用eval / ast.literal_eval的情况下进行操作

>>> list(itertools.chain(*[map(int, w.strip('[]').split(',')) for w in l]))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

答案 2 :(得分:0)

使用列表理解

import json
string_list = ['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']
output_list = [y for x in string_list for y in json.loads(x)]
print output_list

输出

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

在这里只需要遍历列表,而空间复杂度就是新列表。

import json
string_list = ['[1,2,3]','[4,5,6]','[7,8,9]','[10,11,12]']
output_list = []
for str_list in string_list:
    output_list.extend(json.loads(str_list))
print output_list

输出

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

答案 3 :(得分:0)

前一段时间遇到此问题。这是我的方法

List = [[1,2,3],[4,5,6],[7,8,9]]
result = []
for x in range(len(List)):
    for y in range(len(List[x])):
        result.append(List[x][y])

print(result)

结果打印[1,2,3,4,5,6,7,8,9]

可能没有其他答案那么有效,但是它可以工作并且更简单

答案 4 :(得分:0)

这是我的一线时尚解决方案,无需使用itertools并且易于阅读:

import ast

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

myNewList = [i for sublist in map(ast.literal_eval, myList) for i in sublist]

print(myNewList)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

这也是另一个可能更快的解决方案:

import ast

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

myNewList = []

for sublist in myList:
    myNewList += ast.literal_eval(sublist)

print(myNewList)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

答案 5 :(得分:0)

您可以尝试以下简单方法。

echo "<Response>
        <Dial timeout='30' callerId='".$callerId."' record='record-from-answer'>
            <Client>".$user_name."</Client>
        </Dial>
    </Response>";

使用 reduce() lambda 的另一种方法。

echo "<Response>
         <Dial timeout='30' callerId='".$callerId."' record='record-from-answer'>
             <Sip>".$username."@mydomain.sip.us1.twilio.com</Sip>
         </Dial>
   </Response>";

答案 6 :(得分:0)

ast.literal_eval + numpy.flatten

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()))

和:

import ast
l = []
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)