在Python中使用regex对列表排序

2024-10-03 11:19:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下格式的电子邮件地址列表:

姓名###@电子邮件在

但数字并不总是存在的。例如:john45@email.com, bob@email.comjoe2@email.com,等等。我想把这些名字按数字排序,没有数字的名字排在第一位。我已经想出了一些可行的方法,但是作为Python的新手,我很好奇是否有更好的方法来实现它。我的解决方案是:

import re

def sortKey(name):
    m = re.search(r'(\d+)@', name)
    return int(m.expand(r'\1')) if m is not None else 0

names = [ ... a list of emails ... ]
for name in sorted(names, key = sortKey):
    print name

但我不确定怎么用这个函数。我知道这会起作用:

^{pr2}$

但我想我不需要打电话搜索两次。在Python中最优雅的方法是什么?在


Tags: 方法namerecom列表names电子邮件email
1条回答
网友
1楼 · 发布于 2024-10-03 11:19:56

最好使用re.findall就好像没有找到数字一样,那么它将返回一个空列表,该列表将在填充的列表之前排序。用于排序的键是找到的任何数字(转换为整数),后跟字符串本身。。。在

emails = 'john45@email.com bob@email.com joe2@email.com'.split()

import re
print sorted(emails, key=lambda L: (map(int, re.findall('(\d+)@', L)), L))
# ['bob@email.com', 'joe2@email.com', 'john45@email.com']

而使用john1来代替,输出是:['bob@email.com', 'john1@email.com', 'joe2@email.com'],这表明尽管在词典学上是在joe之后,但是这个数字已经被考虑了,首先将john前移。在

如果您想保留现有的使用方法,有一种方法有些老套搜索在一个单一的班轮(但恶心):

^{pr2}$

相关问题 更多 >