如何在Python中按字母表顺序对字符串中的字母进行排序

222
有没有一种简单的方法可以在Python中按字母顺序对字符串中的字母进行排序?
例如:
a = 'ZENOVW'

我想退货:
'ENOVWZ'
7个回答

375

你可以做:

>>> a = 'ZENOVW'
>>> ''.join(sorted(a))
'ENOVWZ'

请注意,sorted(a)将返回一个已排序的列表,因此对于字符串比较,您不需要使用join()(请参见下面askewchan的答案)。 - Skippy le Grand Gourou
4
注意,''.join(sorted(a, reverse=True, key=str.lower)) 可以用来执行反向不区分大小写的排序。可能会很方便。 - Superdooperhero

113
>>> a = 'ZENOVW'
>>> b = sorted(a)
>>> print(b)
['E', 'N', 'O', 'V', 'W', 'Z']

sorted 返回一个列表,所以你可以使用 join 将其再次转换为字符串:

>>> c = ''.join(b)

使用空字符串''b的各个项连接在一起。

>>> print(c)
'ENOVWZ'

41

使用Sorted()方法解决方案可能会导致其他字符串出现一些意料之外的结果。

其他解决方案列表:

对字母进行排序并使它们不同:

>>> s = "Bubble Bobble"
>>> ''.join(sorted(set(s.lower())))
' belou'

将字母排序并使它们不重复,同时保留大小写:

>>> s = "Bubble Bobble"
>>> ''.join(sorted(set(s)))
' Bbelou'

排序字母并保留重复项:

>>> s = "Bubble Bobble"
>>> ''.join(sorted(s))
' BBbbbbeellou'
如果你想要去除结果中的空格,可以在任何被提到的情况下添加 strip() 函数:
>>> s = "Bubble Bobble"
>>> ''.join(sorted(set(s.lower()))).strip()
'belou'

嘿,第一个解决方案对于我在作业中使用二分法查找字母的问题有些有用。是的,我已经知道字符串类和find()方法,但这违背了练习的目的 ;) - runlevel0

12

Python函数sorted对字符串返回基于ASCII编码的结果。

错误示范:在下面的例子中,ed由于它们的ASCII值较小,所以排在HW之后。

>>>a = "Hello World!"
>>>"".join(sorted(a))
' !!HWdellloor'

CORRECT:为了在不改变字母大小写的情况下编写排序后的字符串,请使用以下代码:

>>> a = "Hello World!"
>>> "".join(sorted(a,key=lambda x:x.lower()))
' !deHllloorW'

OR (Ref: https://docs.python.org/3/library/functions.html#sorted)

>>> a = "Hello World!"
>>> "".join(sorted(a,key=str.lower))
' !deHllloorW'

如果你想去掉所有标点符号和数字,可以使用以下代码:

>>> a = "Hello World!"
>>> "".join(filter(lambda x:x.isalpha(), sorted(a,key=lambda x:x.lower())))
'deHllloorW'

10
你可以使用functools.reduce
>>> from functools import reduce
>>> a = 'ZENOVW'
>>> reduce(lambda x,y: x+y, sorted(a))
'ENOVWZ'

1
需要导入 reduce,即 from functools import reduce,这使得它有些棘手。 - WestCoastProjects

2

这段代码可以用于在Python中对字符串进行字母顺序排序,而不使用任何内置函数。

k = input("请再次输入任意字符串 ")

li = []
x = len(k)
for i in range (0,x):
    li.append(k[i])

print("List is : ",li)


for i in range(0,x):
    for j in range(0,x):
        if li[i]<li[j]:
            temp = li[i]
            li[i]=li[j]
            li[j]=temp
j=""

for i in range(0,x):
    j = j+li[i]

print("After sorting String is : ",j)

2
理想情况下,您希望添加一些代码说明,以清楚地说明其功能。欢迎来到SO! - geisterfurz007

0

非常喜欢使用reduce()函数的答案。这里有另一种使用accumulate()函数对字符串进行排序的方法。

from itertools import accumulate
s = 'mississippi'
print(tuple(accumulate(sorted(s)))[-1])

sorted(s) -> ['i', 'i', 'i', 'i', 'm', 'p', 'p', 's', 's', 's', 's']

tuple(accumulate(sorted(s)) -> ('i', 'ii', 'iii', 'iiii', 'iiiim', 'iiiimp', 'iiiimpp', 'iiiimpps', 'iiiimppss', 'iiiimppsss', 'iiiimppssss')

我们选择元组的最后一个索引 (-1)


恭喜你的第一个答案。只是考虑一个由100万个字符组成的字符串,你的tuple()命令将创建一个巨大的选项列表,这将使用不必要的大量内存。 - tda
同意。因此,为了改善空间复杂度,想法是直接使用可迭代对象本身,而不是将其转换为数据结构。很好。谢谢。 - Mono

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接