我有一个按以下格式组织的名单和地址列表:
Mr and Mrs Jane Doe
Candycane Lane
Magic Meadows, SC
我有几个像这样编写的数据块,我希望能够按姓氏(Doe,在本例中)对每个块进行字母顺序排列。在做了一些挖掘之后,我能想到的最好的是我需要创建一个“列表列表”,然后使用姓氏作为按字母顺序排列块的键。然而,考虑到python的新鲜感和缺乏Google技能,我能找到的最接近的是this。我很困惑将每个块转换为一个列表,然后将其切片;我似乎无法找到一种方法来做到这一点,仍然能够正确地按字母顺序排列。非常感谢任何和所有指导。
答案 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]
)