4

次のリストがあります。

[('mail', 167, datetime.datetime(2010, 9, 29)) , 
 ('name', 1317, datetime.datetime(2011, 12, 12)), 
 ('mail', 1045, datetime.datetime(2010, 8, 13)), 
 ('name', 3, datetime.datetime(2011, 11, 3))]

そして、日付が最新ではないタプルの最初のアイテムと一致するアイテムをリストから削除したいと思います。言い換えれば、私はこれを取得する必要があります:

[('mail', 167, datetime.datetime(2010, 9, 29)) , 
 ('name', 1317, datetime.datetime(2011, 12, 12))]
4

5 に答える 5

16

辞書を使用して、これまでに特定のキーで見つかった最大値を格納できます。

temp = {}
for key, number, date in input_list:
    if key not in temp: # we see this key for the first time
        temp[key] = (key, number, date)
    else:
        if temp[key][2] < date: # the new date is larger than the old one
            temp[key] = (key, number, date)
result = temp.values()
于 2011-06-29T09:06:08.463 に答える
2

次のアプローチでは、辞書を使用して、同じキーを持つエントリを上書きします。リストは日付順に並べ替えられているため、古いエントリは新しいエントリで上書きされます。

temp = {}
for v in sorted(L, key=lambda L: L[2]): # where L is your list
    temp[v[0]] = v
result = temp.values()

または、もっとコンパクトなもの (ただし読みにくい) の場合:

result = dict((v[0],v) for v in sorted(L, key=lambda L: L[2])).values()

アップデート

リストがすでに (またはほとんど) 日付でソートされている場合、この方法はかなり高速です。そうでない場合、特にリストが大きい場合、これは最善の方法ではない可能性があります。

ソートされていないリストの場合、最初にキーでソートし、次に日付でソートすると、パフォーマンスが向上する可能性があります。すなわちsorted(L, key=lambda L: (L[0],L[2]))

または、さらに良いことに、Space_C0wb0y's answer .

于 2011-06-29T09:21:58.387 に答える
0
d = {}

for item in list:
    if (item[0], item[1]) not in d:
        d[(item[0], item[1])] = item[2]
    else:
        if item[2] > d[(item[0], item[1])]:
            d[(item[0], item[1])] = item[2]

item = [(x[0], x[1], d[x] for x in d.keys()]
于 2011-06-29T09:08:09.137 に答える
0

リストをソートし、d[2] で最大値を取得することでそれを行うことができます。

    In [26]: d
    Out[26]: 
    [('mail', 167, datetime.datetime(2010, 9, 29, 0, 0)),
     ('name', 1317, datetime.datetime(2011, 12, 12, 0, 0)),
     ('mail', 1045, datetime.datetime(2010, 8, 13, 0, 0)),
     ('name', 3, datetime.datetime(2011, 11, 3, 0, 0))]

    In [27]: d.sort(key = lambda i: i[2], reverse=True)

    In [28]: d
    Out[28]: 
    [('name', 1317, datetime.datetime(2011, 12, 12, 0, 0)),
     ('name', 3, datetime.datetime(2011, 11, 3, 0, 0)),
     ('mail', 167, datetime.datetime(2010, 9, 29, 0, 0)),
     ('mail', 1045, datetime.datetime(2010, 8, 13, 0, 0))]

    In [29]: [i for pos, i in enumerate(d) if i[0] in [j[0] for j in d[pos+1:]]]
    Out[29]: 
    [('name', 1317, datetime.datetime(2011, 12, 12, 0, 0)),
     ('mail', 167, datetime.datetime(2010, 9, 29, 0, 0))]
于 2011-06-29T09:17:53.837 に答える
-1

どうぞ。

#!/usr/bin/python2

from pprint import pprint
import datetime

ol = [('mail', 167, datetime.datetime(2010, 9, 29)) , 
     ('name', 1317, datetime.datetime(2011, 12, 12)), 
     ('mail', 1045, datetime.datetime(2010, 8, 13)), 
     ('name', 3, datetime.datetime(2011, 11, 3))]

d = {}

for t in sorted(ol, key=lambda t: (t[0], t[2])):
    d[t[0]] = t
out = d.values()

pprint(out)

これは、1 番目と 3 番目のタプル要素をキーとしてリストを並べ替え、ハッシュ テーブルを使用して重複を削除します。

于 2011-06-29T09:23:41.973 に答える