1

次の形式で整理された名前と住所のリストがあります。

Mr and Mrs Jane Doe  
Candycane Lane  
Magic Meadows, SC 

このように記述されたデータのブロックがいくつかあり、各ブロックを姓(この場合はDoe)でアルファベット順に並べ替えることができるようにしたいと思います。いくつか掘り下げた後、私が考えることができる最善のことは、「リストのリスト」を作成し、ブロックをアルファベット順に並べるためのキーとして姓を使用する必要があるということです。しかし、Pythonの鮮度とグーグルのスキルの欠如からすると、私が見つけた最も近いものはこれでした。各ブロックをリストに変換してからスライスすることについて、私は混乱しています。これを行う方法を見つけることができず、それでも適切にアルファベット順に並べ替えることができるようです。ありとあらゆるガイダンスを大歓迎します。

4

3 に答える 3

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])の最後の単語()を取得します

于 2013-01-01T19:24:23.433 に答える
2

私が正しく理解していれば、基本的に必要なのは、「値に対して行われた計算」(この場合は抽出された姓)によって値を並べ替えることです。

そのためには、keyキーワード引数を.sort()または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)

唯一の要件は、「キー」関数が決定論的であるということです。つまり、指定された入力ごとに常に同じ出力を返します。

また、姓、名の順に並べ替えることもできます。この場合、タプルを返すだけです。指定された2つのアイテムで同じである(last, first)場合は、2つをさらに並べ替えるために使用されます。lastfirst

アップデート

特定のケースでは、この関数がトリックを実行する必要があります。

def my_key_function(original_name):
    return original_name.splitlines()[0].split()[-1]
于 2013-01-01T19:16:29.023 に答える
2

新しいリストを作成します。各エントリは、必要なソートキーとすべてを含むタプルです。そのリストを並べ替えてから、並べ替えの各エントリの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]

もちろん、ラムダを使用すると、よりコンパクトになる可能性がありますが、読みやすくする方が良いです:)

于 2013-01-01T19:20:31.317 に答える