2017-03-21 43 views
0

タプル(last_name、first_name)のリストがあり、last_nameでアルファベット順にアルファベット順にソートしたい場合、2人の名前がソートされる名前のアルファベット順1行でこれを行う方法はありますか?文字列のアルファベット順とアルファベット順の並べ替え '

私はあなたが逆の姓でソートその後、最初の名前でソートの安定性と最初のソートに依存しているとことができると思います2行

Sorted(names, key = ?) = [('Zane', 'Albert'), ('Zane', 'Bart'), ('Python', 'Alex'), ('Python', 'Monty')] 

+0

はい...それはデフォルトのソートですが...あなたが何を必要といけない... 'ソート(名前)' –

+0

@JoranBeasleyありません本当に。 –

+0

私はrpobably読み込みが速すぎる...しかし、 '(A、B)vs(A、C)'は、あなたが望むものがどのように聞こえるかを正確にソートします(最初は姓で、ファーストネーム) –

答えて

1

ここitertools.groupbyソリューションです:ソートの

from itertools import groupby 
from operator import itemgetter 

li = [('x', 'y'), ('s', 'e'), ('s, 'a'), ('x', 'z')] 

[p for k, g in groupby(sorted(li, reverse=True), itemgetter(0)) for p in reversed(list(g))] 
# [('x', 'y'), ('x', 'z'), ('s', 'a'), ('s', 'e')] 
2

Is there a way to do this with one line?

With two lines I guess you could rely on sort stability and first sort by first name and then sort by last name reversed.

さてあなたは1行でまさにそれを行うことができます。

sorted(sorted(names, key=lambda name: name[1]), key=lambda name: name[0], reverse=True) 

グレードを下降して、年齢を昇順で生徒データをソートするSorting Mini-HOW TO」でまさにこの問題のための2種類をやって、まず年齢区分を行い、次に等級「」を使用して再度並べ替えます。


ちょうど1 sortedkeyでそれをやって愚かな選択肢は:代わりにkeyの1 sortedcmp

sorted(names, key=lambda name: ([-ord(c) for c in name[0]], name[1])) == correct 

A Pythonの2溶液:

sorted(names, lambda a, b: cmp(b[0], a[0]) or cmp(a, b)) 
+0

;)1行で私は一度だけソートを意味しました....しかし、技術的には真です! – Seraphya

+0

ありがとうございます。私はあなたが仕事をしたときにこれを入力する途中でした。私の応答はもはや有用ではなく、[リンク](https://wiki.python.org/moin/HowTo/Sorting)を除きます。 – Prune

+0

@Seraphya Okただ、ソートされたソリューションを追加しました。 –

0

はい、あなたは安定性に頼ることができます

names = [('Zane', 'Albert'), ('Zane', 'Bart'), ('Python', 'Alex'), ('Python', 'Monty')] 

names.sort() 
names.sort(reverse=True, key=lambda i: i[0]) 
+0

FYI:ソートの安定性が追加され、Python 2.2 – Prune

関連する問題