我有以下代码处理将两个列表的输出打印为字符串,最终如果列表为空则应打印" 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))
答案 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)))