3

例如,我会有一个列表

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

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

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

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

4

3 回答 3

13

使用一个key函数:

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

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

  • 在空白处拆分一次,从右侧开始
  • 取拆分的最后一个元素
  • 把它变成一个整数

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

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

实际上,在对值进行排序时,会使用该函数的返回值进行扩充,排序的内容是:

[(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']
于 2013-03-26T17:42:08.787 回答
3

使用key可以满足您需求的功能:

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

如果您的某些项目不遵循该格式,则您必须编写一些更详细的内容。

于 2013-03-26T17:41:38.603 回答
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是一个生成成对的名字年龄的生成器。您将其提供给字典理解并将第二个参数转换为整数。

但是,基本的想法是,如果您使用更精确的数据类型来实现您的目的,您将拥有更轻松的时间。

于 2013-03-30T15:36:16.347 回答