为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

有只小跳蛙 2021-03-29 12:21:31
例如,我将如何最佳地合并: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.65slist(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 astimport itertoolsl = ['[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如果使用evallist(itertools.chain(*map(eval, res_str)))spend  time 0.58s这边走:eval('+'.join('+'.join(arr)))  spend time 3.5s这边走: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()))spend time 1s如果使用eval list(np.array([res_str中i的eval(i)))。flatten())花费时间0.58s
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

使用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 整理清单。


查看完整回答
反对 回复 2021-04-13
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

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


>>> 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]


查看完整回答
反对 回复 2021-04-13
?
暮色呼如

TA贡献1853条经验 获得超9个赞

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)


查看完整回答
反对 回复 2021-04-13
  • 3 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信