python优化:[a,b,c]> [str(a),str(b),str(c)]

时间:2017-10-06 07:36:29

标签: python string list

我需要将各种实体的列表转换为字符串。到目前为止我使用:

all_ents_dead=[] # converted to strings

for i in all_ents:
    all_ents_dead.append(str(i))

有没有一种优化的方法呢?

编辑:然后我需要找到其中哪些包含某些字符串。到目前为止,我有:

matching = [s for s in all_ents_dead if "GROUPS" in s]

2 个答案:

答案 0 :(得分:3)

如果您的循环模式中有name = []name.append(),请考虑使用list comprehension。列表推导从循环构建列表,而不必使用list.append()查找和调用,使其更快:

all_ents_dead = [str(i) for i in all_ents]

这直接回应了您的代码,但all_ents_dead.append(...)内的表达式移到了for循环的前面。

如果您实际上不需要列表,但只需要迭代str()次转化,则应考虑延迟转换选项。您可以将列表理解转换为generator expression

all_ents_dead = (str(i) for i in all_ents)

或者,当仅应用函数时,map() function中的更快的替代方法:

all_ents_dead = map(str, all_ents)  # assuming Python 3

在迭代生成的对象时,两者都懒惰地应用str()。这有助于避免创建一个新的列表对象,而您实际上并不需要这样做,从而节省内存。请注意,生成器表达式可以更慢;如果性能受到威胁,请考虑基于输入大小,内存限制和时间试验的所有选项。

对于您的特定搜索示例,您只需嵌入map()来电:

matching = [s for s in map(str, all_ents) if "GROUPS" in s]

会生成一个匹配字符串列表,而不会创建一个您不会在其他任何地方使用的字符串对象的中间列表。

答案 1 :(得分:1)

使用map()功能。这将获取现有列表,对每个项目运行一个函数,并返回一个新的列表/迭代器(见下文),并在每个元素上应用函数的结果。

all_ends_dead = map(str, all_ents)

在Python 3+中,map()将返回一个迭代器,而在Python 2中它将返回一个列表。迭代器可以有你想要的优化,因为它在需要时生成值,而不是一次生成(而不是列表)。