如何缩短这个Python打印表达式?
我有一段代码,用来把两个列表的内容打印成字符串,如果列表是空的,就打印“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
我们来看一下,你可以去掉这两个地方的 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)))
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
在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如,有人可能在使用某个工具或者编程语言时,遇到了错误或者不明白的地方。这时候,大家会去一个叫StackOverflow的网站上提问,那里有很多热心的程序员会帮忙解答。
在提问的时候,最好能把问题描述得清楚一些,比如说你遇到的具体错误信息是什么,或者你想实现什么功能。这样别人才能更好地理解你的问题,并给出有效的建议。
另外,提供一些相关的代码片段也是很有帮助的,这样别人可以更快地看出问题出在哪里。比如,你可以把你写的代码放在一个代码块里,像这样:
pretty = lambda a: ','.join(map(str, a)) or 'EMPTY'
'to: %s from: %s' % (pretty(old), pretty(new))
。这样,大家就能清楚地看到你的代码是怎样的。
总之,提问的时候尽量详细、清晰,这样才能更快地找到解决问题的方法。
3
为了让这个内容更容易理解,我会把格式化的部分提取到一个函数里:
def fmt(l):
return ','.join(map(str, l)) if l else 'EMPTY'
print 'to: %s from: %s' % (fmt(new), fmt(old))
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]