2011-01-25 13 views
1

人の名前と日付のリストを持っていて、一人ひとりの最も早い日付のエントリだけを保持したいのですが、どうすればいいですか?私は、最後のリストを姓とアルファベット順にアルファベット順に並べて、最後に日付が最も古いエントリのみを含むようにします。リストの中で最も早いものを選択する

ここではリストの例と試したことがありますが、同じリストをもう一度返しました。最終製品がどのように見えるはずです

L1=['Smith, John, 1994', 'Smith, John, 1996', 'Smith, John, 1998', 'Smith, Joan, 1993', 'Smith, Joan, 1995', 'Smith, Jack, 1989', 'Smith, Jack, 1991', 'Jones, Adam, 2000', 'Jones, Adam, 1998', 'Jones, Sarah, 2002', 'Jones, Sarah, 2005', 'Brady, Tom, 2001', 'Brady, Tonya, 2002'] 

L1.sort() 

L2= [] 

for item in L1: 
    if item.split(',')[:2] not in L2: 
     L2.append(item) 

L2=['Brady, Tom, 2001', 'Brady, Tonya, 2002', 'Jones, Adam, 1998', 'Jones, Sarah, 2002', 'Smith, Jack, 1989', 'Smith, Joan, 1993', 'Smith, John, 1994'] 

すべてのヘルプや洞察力をいただければ幸いです!

答えて

2

は、あなただけの名前である、item.split(',')[:2]ためL2を検索しているので、あなたのコードは動作しません

L1.sort() 
[next(j) for i, j in itertools.groupby(L1, lambda x: x.rsplit(",", 1)[0])] 

を試してみてください。しかし、リストの文字列は名前と年で構成されています。そのため、not inは常にTrueという結果になります。

+0

'sorted()'を追加すると完璧になります – eumiro

+0

これは、itertoolsが定義されていないというエラーが表示されていますか? – marsx

+0

@marsx:明示的にそう言っていませんでしたが、その後、あなたは 'itertools'をインポートする必要があります:) –

0
>>> from itertools import groupby 
>>> [next(j) for i, j in groupby(sorted(L1), lambda x: x.rpartition(",")[0])] == L2 
True 
0

リストおよびタプルソートに組み込まれたPythonの再帰型は再帰的です。あなたのデータはそうのように保存されている場合:

L1=[(1,2,3), 
    (2,3,4), 
    (1,1,3)] 

これは、各タプルの最初の項目によってあなたのリストを並べ替えるだろうし、その上の2番目の項目で各グループを並べ替え、および。結果ビーイングは:

[(1, 1, 3), (1, 2, 3), (2, 3, 4)] 

だから(Date, Last, First)のタプルにあなたの文字列を壊した場合、その後の並べ替えあなたが望む順序を取得しますが、その後、あなたが戻って一緒にあなたの文字列をステッチする必要があります。

+0

これは再帰的ソートの意味ではありません。そして、それはこの質問にどのくらい正確に関係していますか? OPは4桁の年を使用しているため、文字列内でうまくソートされます。 – SilentGhost