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

1 投票
5 回答
2227 浏览
提问于 2025-04-18 03:08

我有一段代码,用来把两个列表的内容打印成字符串,如果列表是空的,就打印“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]

撰写回答