Pythonic排序列表的方式

时间:2013-03-26 17:40:40

标签: python sorting

例如,我会有一个

列表
lists = ['jack 20', 'ben 10', 'alisdar 50', 'ollie 35']

我需要根据数字对其进行排序,

lists.sort() = ['ben 10', 'jack 20', 'ollie 35', 'alisdar 50']

可能以某种方式使用split()格式?

3 个答案:

答案 0 :(得分:13)

使用key功能:

lists.sort(key=lambda s: int(s.rsplit(None, 1)[-1]))

key callable传递lists中的每个元素,并根据返回值对该元素进行排序。在这种情况下,我们

  • 在空白处拆分一次,从右侧开始
  • 取分裂的最后一个元素
  • 将其转换为整数

key的参数可以是任何可调用的,但lambda更紧凑。您可以在命令提示符下尝试:

>>> key_function = lambda s: int(s.rsplit(None, 1)[-1])
>>> key_function('ben 10')
10
>>> key_function('Guido van Rossum 42')
42

实际上,当使用该函数的返回值对值进行排序 augmented 时,排序的是:

[(20, 0, 'jack 20'), (10, 1, 'ben 10'), (50, 2, 'alisdar 50'), (35, 3, 'ollie 35')]

代替(使用第二个值,元素的索引,在相同排序键的情况下添加以保持原始顺序)。

结果:

>>> lists = ['jack 20', 'ben 10', 'alisdar 50', 'ollie 35']
>>> lists.sort(key=lambda s: int(s.rsplit(None, 1)[-1]))
>>> lists
['ben 10', 'jack 20', 'ollie 35', 'alisdar 50']

答案 1 :(得分:3)

使用符合您要求的key功能:

lists.sort(key=lambda e: int(e.split()[1]))

如果你的某些商品不符合这种格式,你就必须写一些更精细的内容。

答案 2 :(得分:1)

如果你有一个比字符串更合适的数据类型来代表一个人的姓名和年龄,那会更好。一种方法是字典:

lists = ['jack 20', 'ben 10', 'alisdar 50', 'ollie 35']
d = dict(item.split(' ') for item in lists)

这从两个元素列表的流构造一个字典。

然后你可以这样排序:

print sorted((v, k) for k, v in d.iteritems())

得到这个:

>>> lists = ['jack 20', 'ben 10', 'alisdar 50', 'ollie 35']
>>> d = dict(item.split(' ') for item in lists)
>>> print sorted((v, k) for k, v in d.iteritems())
[('10', 'ben'), ('20', 'jack'), ('35', 'ollie'), ('50', 'alisdar')]

或者您可以将年龄转换为整数:

>>> lists = ['jack 20', 'ben 10', 'alisdar 50', 'ollie 35']
>>> person_iter = (item.split(' ') for item in lists)
>>> d = {k: int(v) for k, v in person_iter}
>>> print sorted((v, k) for k, v in d.iteritems())
[(10, 'ben'), (20, 'jack'), (35, 'ollie'), (50, 'alisdar')]

person_iter是一个生成名称年龄对的生成器。您将其提供给字典理解并将第二个参数转换为整数。

但基本的想法是,如果您为自己的目的使用更精确的数据类型,您将会更轻松。