在Python中按字母顺序排列多行值列表?

时间:2013-01-01 19:02:41

标签: python list sorting tuples

我有一个按以下格式组织的名单和地址列表:

Mr and Mrs Jane Doe  
Candycane Lane  
Magic Meadows, SC 

我有几个像这样编写的数据块,我希望能够按姓氏(Doe,在本例中)对每个块进行字母顺序排列。在做了一些挖掘之后,我能想到的最好的是我需要创建一个“列表列表”,然后使用姓氏作为按字母顺序排列块的键。然而,考虑到python的新鲜感和缺乏Google技能,我能找到的最接近的是this。我很困惑将每个块转换为一个列表,然后将其切片;我似乎无法找到一种方法来做到这一点,仍然能够正确地按字母顺序排列。非常感谢任何和所有指导。

3 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要的主要是通过“对值进行一些计算”来排序值,在这种情况下是提取的姓氏。

为此,请使用key.sort()的{​​{1}}关键字参数:

sorted()

唯一的要求是你的“密钥”功能是确定性的,即总是为每个给定的输入返回相同的输出。

您可能还希望按姓氏和名字排序:在这种情况下,只需返回一个元组def my_key_function(original_name): ## do something to extract the last name, for example: try: return original_name.split(',')[1].strip() except IndexError: return original_name my_sorted_values = sorted(my_original_values, key=my_key_function) :如果(last, first)对两个给定项目相同,last将用于进一步对这两者进行排序。

更新

对于您的具体情况,此功能应该可以解决问题:

first

答案 1 :(得分:2)

你想创建一个新列表,其中每个条目都是一个包含你想要的排序键和整个事物的元组。对该列表进行排序,然后获取排序中每个条目的第二个组成部分:

def get_sort_name (address):
    name, address, city = address.split('\n')
    return (name.split(' ')[-1] , address) # last item of first line & whole thing as tulle


keyed_list = map (get_sort_name, addresses)
keyed_list.sort()
sorted_addresses = [item[1] for item in keyed_list]

当然,使用lambdas可以更紧凑,但最好是可读的:)

答案 2 :(得分:2)

假设您已将数据列入清单

l = ['Mr and Mrs Jane Smith\nCandycane Lane\nMagic Meadows, SC',
     'Mr and Mrs Jane Doe\nCandycane Lane\nMagic Meadows, SC',
     'Mr and Mrs Jane Atkins\nCandycane Lane\nMagic Meadows, SC']

您可以指定要排序的密钥。

l.sort(key=lambda x: x.split('\n')[0].split(' ')[-1])

在这种情况下,请在第一行(.split(' ')[-1]

获取最后一个字(.split('\n')[0]