繁体   English   中英

自然地通过元组中Python的第一个元素对字母数字元组进行排序

[英]Naturally sort a list of alpha-numeric tuples by the tuple's first element in Python

之前的stackoverflow问题解释了如何按字母顺序对字符串列表进行排序。 我想用元组的第一个元素按字母数字排序元组列表。

例1:

>>> sort_naturally_tuple([('b', 0), ('0', 1), ('a', 2)])
[('0', 1), ('a', 2), ('b', 0)]

例2:

>>> sort_naturally_tuple([('b10', 0), ('0', 1), ('b9', 2)])
[('0', 1), ('b9', 2), ('b10', 0)]

更新:要强调字母数字因素,请查看示例2。

使用另一个问题的第二个答案,概括为支持项目上的任何方法作为获取密钥的基础:

import re
from operator import itemgetter

def sorted_nicely(l, key):
    """ Sort the given iterable in the way that humans expect."""
    convert = lambda text: int(text) if text.isdigit() else text
    alphanum_key = lambda item: [ convert(c) for c in re.split('([0-9]+)', key(item)) ]
    return sorted(l, key = alphanum_key)


print sorted_nicely([('b10', 0), ('0', 1), ('b9', 2)], itemgetter(0))

这与该答案完全相同,除了通用以使用任何可调用项作为对项的操作。 如果你只是想在一个字符串上做,你可以使用lambda item: item ,如果你想在列表,元组,字典或集合上做,你可以使用operator.itemgetter(key_or_index_you_want) ,或者如果你想使用它你想在类实例上做到这一点你可以使用operator.attrgetter('attribute_name_you_want')

它给

[('0', 1), ('b9', 2), ('b10', 0)]

为你的例子#2。

默认情况下,元组按其元素排序,从第一个开始。 这么简单

L = [('b', 0), ('0', 1), ('a', 2)]
L.sort()
print L
# or create a new, sorted list
print sorted([('b', 0), ('0', 1), ('a', 2)])

您喜欢谈论自然排序的问题,这与普通(字母数字)排序不同。

假设您只想对第一项进行自然排序:

import re
def naturalize(item):
    # turn 'b10' into ('b',10) which sorts correctly
    m = re.match(r'(\w+?)(\d+)', item)
    return m.groups()
# now sort by using this function on the first element of the tuple:
print sorted(L, key=lambda tup: naturalize(tup[0]))

正如其他人所指出的,sorted将默认使用元组的第一个元素。 如果要修改此默认行为,可以指定在比较期间使用的键。

sorted([('b', 0), ('0', 1), ('a', 2)])

将返回相同的:

sorted([('b', 0), ('0', 1), ('a', 2)], key=lambda item: item[0])

要按第二个元素排序,请尝试:

sorted([('b', 0), ('0', 1), ('a', 2)], key=lambda item: item[1])

natsort模块默认执行此操作,无需任何额外工作

>>> from natsort import natsorted
>>> natsorted([('b', 0), ('0', 1), ('a', 2)])
[('0', 1), ('a', 2), ('b', 0)]
>>> natsorted([('b10', 0), ('0', 1), ('b9', 2)])
[('0', 1), ('b9', 2), ('b10', 0)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM