Python中将List[Tuple[str]]转换为List[str]的更优实现方法
问题:将单元素元组列表转换为普通列表
我有如下格式的数据:
[('a',), ('b',), ('c',),('d',)]希望将其转换为:
['a', 'b', 'c', 'd']我尝试了以下代码:
p = [('a',), ('b',), ('c',),('d',)] [el[0] for el in p]请问是否有更“Pythonic”的实现方式?由于我的列表包含165400个元组,我希望避免使用循环。
解答
首先明确:你用的列表推导式本身就是非常Pythonic的写法,针对16万+元素的规模,它的效率已经足够高。
如果想尝试其他简洁的实现方式,这里有几个可选方案:
1. 使用itertools.chain.from_iterable扁平化序列
这个方法可以直接把嵌套的单元素元组展开成一维序列:
import itertools p = [('a',), ('b',), ('c',),('d',)] result = list(itertools.chain.from_iterable(p))
不过本质上它依然会遍历所有元素,性能和列表推导式相差无几。
2. 用map配合operator.itemgetter
借助标准库的工具函数,写法更简洁,底层实现也很高效:
import operator p = [('a',), ('b',), ('c',),('d',)] result = list(map(operator.itemgetter(0), p))
operator.itemgetter(0)会直接提取每个元组的第一个元素,map则会把这个操作应用到列表的每个元素上,最后转成列表即可。
关于“避免循环”的说明
在Python里,几乎没有办法完全避开遍历操作——任何处理序列中所有元素的逻辑,本质上都需要循环。列表推导式是Python官方推荐的高效写法,兼具可读性和性能,完全可以继续使用。
如果追求极致性能,且数据适合的话,可以尝试用numpy处理:
import numpy as np p = [('a',), ('b',), ('c',),('d',)] result = np.array(p).flatten().tolist()
但对于普通字符串列表来说,numpy的初始化和转换开销可能反而不如原生列表推导式划算,需要根据实际场景测试。
内容的提问来源于stack exchange,提问作者NicWorkAccount
相关产品推荐
相关产品推荐

