例如,我将如何最佳地合并:
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秒
答案 0 :(得分:1)
使用ast
和itertools
例如:
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)