gpt4 book ai didi

python - 列表理解清理的更清洁方法

转载 作者:行者123 更新时间:2023-11-28 18:46:15 25 4
gpt4 key购买 nike

这与我之前的问题有关:Converting from nested lists to a delimited string

我有一个外部服务,它以带分隔符的字符串格式向我们发送数据。它是项目列表,最多 3 层深。级别 1 由“|”分隔。级别 2 由“;”分隔级别 3 由 ',' 分隔。每个级别或元素可以有 0 个或多个项目。一个简化的例子是:
a,b;c,d|e||f,g|h;;

我们有一个函数可以将其转换为嵌套列表,这就是它在 Python 中的操作方式。

def dyn_to_lists(dyn):  
return [[[c for c in b.split(',')] for b in a.split(';')] for a in dyn.split('|')]

对于上面的示例,此函数产生以下结果:

>>> dyn = "a,b;c,d|e||f,g|h;;"
>>> print (dyn_to_lists(dyn))
[[['a', 'b'], ['c', 'd']], [['e']], [['']], [['f', 'g']], [['h'], [''], ['']]]

对于列表,在任何级别,只有一项,我们希望它作为标量而不是 1 项列表。对于空列表,我们希望它们只是一个空字符串。我想出了这个功能,它确实有效:

def dyn_to_min_lists(dyn):
def compress(x):
return "" if len(x) == 0 else x if len(x) != 1 else x[0]

return compress([compress([compress([item for item in mv.split(',')]) for mv in attr.split(';')]) for attr in dyn.split('|')])

使用这个函数并使用上面的例子,它返回(*见下面的更新):

[[['a', 'b'], ['c', 'd']], 'e', '', ['f', 'g'], ['h', '', '']]

作为 Python 的新手,我不确定这是最好的方法。有没有更简洁的方法来处理这个问题?

这可能会有大量数据通过它,是否有更有效/可扩展的方法来实现这一点?

更新

我在原来的压缩函数中发现了一个错误。当内部列表包含超过 1 个项目时,无法删除外部列表 - 这将导致转换不可逆。为此,我将@Blender 的压缩功能更新为:

def __compress(x): 
if len(x) > 1:
return x
elif not x:
return ''
else:
if type(x[0]) != list:
return x[0]
else:
return x

现在它返回正确的输出:

[[['a', 'b'], ['c', 'd']], 'e', '', [['f', 'g']], ['h', '', '']]

最佳答案

你可以做一些事情来加快速度:

  • 摆脱最内层的列表理解:[item for item in mv.split(',')] 变为 mv.split(',') .这是没用的。
  • compress 函数移到 dyn_to_min_lists 函数之外。您不希望每次运行 dyn_to_min_lists 时都创建它。
  • 使用真实性比调用 len 更快,因此将 len(x) == 0 替换为 not x
  • 重新排序您的 compress 函数的条件,以便首先出现更常见的情况也会加快速度。

所以生成的代码是:

def compress(x): 
if len(x) > 1:
return x
elif not x:
return ''
else:
return x[0]

def parse(s):
return compress([
compress([
compress(b.split(',')) for b in a.split(';')
]) for a in s.split('|')
])

这是一个速度比较:

>>> %timeit parse('a,b;c,d|e||f,g|h;;')
100000 loops, best of 3: 10 µs per loop
>>> %timeit dyn_to_min_lists('a,b;c,d|e||f,g|h;;')
10000 loops, best of 3: 15.6 µs per loop

它在我的电脑上快了大约 36%。如果这是您脚本中非常关键的部分,请使用 C 语言实现它并将其编译为 C 扩展。

关于python - 列表理解清理的更清洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19614427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com