如何缩短这个Python打印表达式?

时间:2014-04-17 15:59:11

标签: python list printf

我有以下代码处理将两个列表的输出打印为字符串,最终如果列表为空则应打印" EMPTY"。 它有效,但我想让它变得更短。

new = [0,1,3]
old = [0,1,2,3,4,5]
'to: %s from: %s' % (','.join(map(str,new if len(new) > 0 else ["EMPTY"])),','.join(map(str,old if len(old) > 0 else ["EMPTY"])))
#'to: 0,1,3 from: 0,1,2,3,4,5'

任何建议都会受到影响。

假设:

  • 我必须在没有.format
  • 的情况下这样做

更新:

到目前为止,我设法这样做了:

'to: %s from: %s' % tuple(','.join(map(str,i if i else ["EMPTY"])) for i in (new, old))

5 个答案:

答案 0 :(得分:3)

为了使这个可读,我只是将格式分解为函数:

def fmt(l):
   return ','.join(map(str, l)) if l else 'EMPTY'

print 'to: %s from: %s' % (fmt(new), fmt(old))

答案 1 :(得分:3)

pretty = lambda a: ','.join(map(str, a)) or 'EMPTY'
'to: %s from: %s' % (pretty(old), pretty(new))

答案 2 :(得分:2)

你可以这样做:

"to: {0} from: {1}".format(str(new)[1:-1] if new else "EMPTY", 
                           str(old)[1:-1] if old else "EMPTY")

所有空容器(包括[])都会评估False,因此您无需明确检查len()str()会将列表转换为字符串(例如"[1, 2, 3]"),然后切片[1:-1]将获取除第一个字符('[')和最后一个字符']'之外的所有字符)。

你可以对%做同样的事情,但不推荐使用:

"to: %s from: %s" % (str(new)[1:-1] if new else "EMPTY", 
                     str(old)[1:-1] if old else "EMPTY")

注意:这会使用Python的默认list显示,它会在逗号后面添加空格。如果你真的不能忍受,你可以这样做:

"to: %s from: %s" % (str(new)[1:-1].replace(" ", "") if new else "EMPTY", 
                     str(old)[1:-1].replace(" ", "") if old else "EMPTY")

答案 3 :(得分:1)

您实际上是在使用print(因此可以打印列表)还是需要生成字符串?

>>> print "to:", new or "EMPTY" , "from:" , old or "EMPTY"
to: [1, 2, 3] from: [0, 1, 2, 3, 4, 5]
>>> new = []
>>> print "to:", new or "EMPTY" , "from:" , old or "EMPTY"
to: EMPTY from: [0, 1, 2, 3, 4, 5]

答案 4 :(得分:0)

让我们看看,您可以放弃对len()两个电话,但老实说,我可能只是重构。

new = [0,1,3] or ["EMPTY"]
old = [0,1,3] or ["EMPTY"]
print "to: %s from: %s" % (','.join(map(str,new)), ','.join(map(str,old)))