更Pythonic的写法是什么?
我需要把一堆单词整理成一个列表,特别是要把所有以'x'开头的单词放在最前面。
这是我目前的代码:
list_1 = []
list_2 = []
for word in words:
list_1.append(word) if word[0] == 'x' else list_2.append(word)
return sorted(list_1) + sorted(list_2)
不过我觉得还有更简单、更优雅的方法可以做到这一点...
补充说明
举个例子:
['mix', 'xyz', 'apple', 'xanadu', 'aardvark']
处理后应该变成 ['xanadu', 'xyz', 'aardvark', 'apple', 'mix']
。
8 个回答
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能会在使用某个功能时,发现它并没有按照预期的方式工作。这种情况很常见,尤其是对于刚开始学习编程的小伙伴来说。
解决这些问题的关键在于仔细检查代码,看看是否有错误,或者是否遗漏了什么重要的步骤。同时,了解相关的技术概念也非常重要,这样才能更好地理解代码是如何运行的。
总之,遇到问题时,不要着急,慢慢分析,找出原因,才能更好地解决它。
words = ['xoo', 'dsd', 'xdd']
list1 = [word for word in words if word[0] == 'x']
list2 = [word for word in words if word[0] != 'x']
首先,别老是说“pythonic”,当你想表达“干净”的时候。这个词听起来有点俗。
不要那样使用三元表达式;它是用来作为表达式的一部分,而不是用来控制流程的。这样写会更清晰:
for word in words:
if word[0] == 'x':
list_1.append(word)
else:
list_2.append(word)
你可以再改进一下——像这样使用三元表达式是可以的:
for word in words:
target = list_1 if word[0] == 'x' else list_2
target.append(word)
如果 words
是一个容器而不是一个迭代器,你可以使用:
list_1 = [word for word in words if word[0] == 'x']
list_2 = [word for word in words if word[0] != 'x']
最后,我们可以把整个东西都丢掉,改用两次排序:
result = sorted(words)
result = sorted(result, key=lambda word: word[0] != 'x')
这样首先进行正常排序,然后利用Python排序的稳定性,把以“x”开头的单词移到前面,而不改变其他单词的顺序。
>>> words = ['xoo', 'dsd', 'xdd']
>>> sorted(words, key=lambda x: (x[0] != 'x', x))
['xdd', 'xoo', 'dsd']
解释一下:这个关键函数返回的是一对数据(元组)。第一个元素是 False
或 True
,这取决于字符串的第一个字符是不是 'x'
。在排序时,False
会排在 True
前面,所以以 'x'
开头的字符串会排在排序结果的最前面。元组中的第二个元素则用来比较那些第一个元素相同的情况,也就是说,所有以 'x'
开头的字符串会在一起排序,而所有不以 'x'
开头的字符串也会在一起排序。