Python 当不为空时,使用在末尾添加的分隔符进行联接
我需要将Python 当不为空时,使用在末尾添加的分隔符进行联接,python,python-3.x,list-comprehension,Python,Python 3.x,List Comprehension,我需要将列表中的所有元素添加到字符串中;最后,我需要添加一个后缀。点“.”必须分隔所有元素: list_ = args[f(n) : f(n+1)] if list_: string += '.' + '.'.join(list_) + '.' + suffix # works except when list_ is empty else: string += '.' + suffix # list_ isn't used after this 我能在一行中用更简单的方式重写它吗?如
列表中的所有元素添加到字符串中
;最后,我需要添加一个后缀。点“.”必须分隔所有元素:
list_ = args[f(n) : f(n+1)]
if list_:
string += '.' + '.'.join(list_) + '.' + suffix # works except when list_ is empty
else:
string += '.' + suffix
# list_ isn't used after this
我能在一行中用更简单的方式重写它吗?如果join
在每个元素后添加分隔符,则只会出现以下情况:
string += '.' + '.'.join(args[f(n) : f(n+1)]) + '.' + suffix
编辑
我刚刚了解到:
切片是副本,即使它们从未指定给:
但islice可能更糟糕,因为它会遍历列表的开头:
这里讨论了一些备选方案:我同意这一点(更新以反映对问题的编辑):
编辑:从sblom和unutbu的答案中汲取灵感,我可能会这样做:
如果我担心切片args
的内存开销。对于字符串和后缀,可以使用元组(string,)
或列表[string]
;考虑到它们各自是一个元素,内存使用或执行时间没有显著差异,而且因为它们没有被存储,所以您不必担心可变性。我发现列表语法更清晰一些
但是:我不确定Python是否真的为一个只会被使用而不会被分配的切片创建了一个新的列表对象。如果没有,那么假设args
是一个合适的列表,使用islice
over[f(n):f(n+1)]
并不会为您节省很多东西,在这种情况下,我只会使用简单的方法(顶部)。如果args
是一个生成器或其他具有大量元素的惰性计算的iterable,那么islice
可能是值得的。如果list\uu
是一个生成器(或者可以简单地更改为一个),则可以使用chain()不具体化任何列表
来自itertools
from itertools import chain
'.'.join(chain(('',),list_,(suffix,)))
(这从大卫·扎斯拉夫斯基的回答中获得了灵感。)还提到:
这样做的好处是有。对不起,忘了提到list\uu
实际上是一个表达式;我希望避免为它创建一个额外的变量(请参阅更新我的问题)…好吧,您已经在代码中这样做了。。。如果你不介意创建两个额外的列表,那么就使用David的代码吧。是的,在我的例子中,这不是性能问题,只是让代码看起来简单而已。我喜欢这种方法——但我不确定创建一个返回现有列表片段的生成器是否容易?当然,你可以使用itertools.islice(list_u,f(n),f(n+1))
@DavidZaslavsky:我想根据我所学到的(请参阅问题的更新)来看,islice
在列表中的表现很糟糕。。。如果我有一个真正的发电机,我会使用这种方法。这在我的具体情况下似乎是完美的。
'.'.join([''] + args[f(n):f(n+1)] + [suffix])
from itertools import chain, islice
string = '.'.join(chain([string], islice(args, f(n), f(n+1)), [suffix]))
from itertools import chain
'.'.join(chain(('',),list_,(suffix,)))
string = '.'.join([string] + list_ + [suffix])