有什么更好的方法在python中连接字符串?

Sha*_*bus 19 python string string-concatenation

将"更好"理解为更快,更优雅,更易读.

我有两个字符串(ab)可以为null或不.并且我希望只有当两者都不为空时才用连字符连接它们:

a - b

a (如果b为null)

b (其中a为null)

Hoo*_*ady 47

# Concatenates a and b with ' - ' or Coalesces them if one is None
'-'.join([x for x in (a,b) if x])
Run Code Online (Sandbox Code Playgroud)

编辑
以下是此算法的结果(请注意,None将与''的作用相同):

>>> '-'.join([x for x in ('foo','bar') if x])
'foo-bar'
>>> '-'.join([x for x in ('foo','') if x])
'foo'
>>> '-'.join([x for x in ('','bar') if x])
'bar'
>>> '-'.join([x for x in ('','') if x])
''
Run Code Online (Sandbox Code Playgroud)

*另请注意,在下面的帖子中,Rafael的评估仅在过滤方法的1000次迭代中显示出.0002秒的差异,可以推断出这样小的差异可能是由于当时可用系统资源的不一致运行脚本.我在几次迭代中运行了他的timeit实现,并发现任何一种算法在大约50%的时间内都会更快,也不会大幅度提高.因此显示它们基本相同.

  • 好吧,我同意CS101的学生可能不会得到这个,但对于那些进入python的小方法来说,这不是一个困难的概念.我碰巧认为它非常优雅,但不一定是效率最高的.但那是SO的美丽,人们会决定.:-) (8认同)
  • 正如我所说的那样,对于强烈的言辞感到抱歉,但我在大型项目中遇到了很多类似的*未注释的*代码,你花了很多时间搞清楚'这里到底是什么'? (5认同)
  • @Hoopdady:我同意BasicWolf.鉴于这个问题的背景,我可以关注正在发生的事情.但如果它只是出现在一个文件中的一行上,我必须先考虑才能知道它做了什么.当我看到BasicWolf的答案时,我立即知道它在做什么. (5认同)
  • @Hoopdady - 我也会删除''-`周围的parens.让它们离开是非常惯用的 - 事实上,我看到它用括号写的很少,所以括号实际上让我再看看这个. (4认同)
  • @mgilson你是非常惯用的......好吧我会做的.完成. (4认同)
  • @BasicWolf - 据我所知,这是处理"只有两者都不为空"标准的最简单的方法之一(尽管,我会在内部列表中使用`tuple``(a,b )`而不是`[a,b]`) (3认同)
  • @Hoopdady你也可以省略列表理解,并将生成器表达式直接传递给`join`:`' - '.join(x代表x中的x,如果是x)``.这应该(稍微)更快地运行并使用(稍微)更少的内存,因为你没有构建一个中间列表然后扔掉它.它在页面上看起来也不错. (3认同)
  • @mgilson,你看,这里还有一个`join()`的上下文,我反对:当我个人看到`join`时,我希望有一个大于两个或变量(!)的项目量加入.我永远不会使用`join()`显式连接两个字符串. (2认同)
  • @Hoopdady正确,我刚刚在几天前遇到了一个解释:`join`遍历列表两次,因为它在实际进行连接之前预先计算了所需的内存. (2认同)

tox*_*tes 35

简单的事情怎么样:

# if I always need a string even when `a` and `b` are both null,
# I would set `output` to a default beforehand.
# Or actually, as Supr points out, simply do `a or b or 'default'`
if a and b:
    output = '%s - %s' % (a, b)
else:
    output = a or b
Run Code Online (Sandbox Code Playgroud)

编辑:这个帖子中有很多有趣的解决方案.我选择这个解决方案是因为我强调可读性和快速性,至少在实现方面.它不是最具扩展性或最有趣的解决方案,但是对于这个范围它可以工作,并且让我能够非常快速地进入下一个问题.

  • 为简单起见+1 - 不是代码的简单性,而是人类理解和代码之间的映射.是的,我猜这与可读性(以及可维护性,可靠性,可测试性)大致相同. (9认同)
  • +1,我更喜欢在生产代码中看到这一点,因为它清楚地说明了意图 (4认同)
  • 我不太了解Python,但是不能通过将最后一行更改为`output = a或b或'default'而不是事先设置它来处理null/null的情况? (2认同)

ice*_*ime 31

哇,似乎是个热门话题:p我的建议:

' - '.join(filter(bool, (a, b)))
Run Code Online (Sandbox Code Playgroud)

这使:

>>> ' - '.join(filter(bool, ('', '')))
''
>>> ' - '.join(filter(bool, ('1', '')))
'1'
>>> ' - '.join(filter(bool, ('1', '2')))
'1 - 2'
>>> ' - '.join(filter(bool, ('', '2')))
'2'
Run Code Online (Sandbox Code Playgroud)

显然,None行为''与此代码相似.

  • 好方案!现在最优雅. (4认同)
  • `filter(None,(a,b))`也可以,但是`bool`可能更明确一些.对于记录,这与上面使用list-comp的版本没有任何不同. (4认同)

zen*_*poy 12

这是一个选项:

("%s - %s" if (a and b) else "%s%s") % (a,b)
Run Code Online (Sandbox Code Playgroud)

编辑:正如mgilson指出的那样,这个代码会以None"更好的方式(但不太可读的方式)" 失败:

"%s - %s" % (a,b) if (a and b) else (a or b)
Run Code Online (Sandbox Code Playgroud)