0

リストのリストがあります

[['Id', 'fname', 'lname', 'gender', 'startdate'],
['100', 'John', 'Jackson', 'M', '08/09/2000'],
['101', 'Jenny', 'Hobbs', 'F', '01/13/1995'],
['100', 'John', 'Jackson', 'M', '08/09/1995']]

ID == ID AND St​​artDate < StartDate の重複リストを削除したいと考えています。最新の開始日を持つ一意の ID を持つリストを残します。

[['Id', 'fname', 'lname', 'gender', 'startdate'],
['100', 'John', 'Jackson', 'M', '08/09/2000'],
['101', 'Jenny', 'Hobbs', 'F', '01/13/1995']]

どんな助けでも素晴らしいでしょう

4

4 に答える 4

4

行を日付順に並べ替えた後、ID で行をディクショナリに詰め込みます。自分で行う必要があるのは、これを使用する前にヘッダーを削除することだけです。

import time

data = [['100', 'John', 'Jackson', 'M', '08/09/2000'],
['101', 'Jenny', 'Hobbs', 'F', '01/13/1995'],
['100', 'John', 'Jackson', 'M', '08/09/1995']]

data = sorted(data, key=lambda x:time.strptime(x[4], '%m/%d/%Y'))   # sort data in ascending date order

keys = [x[0] for x in data]
print keys

d = dict(zip(keys,data))                 # add to dictionary ... most recent values overwrite older ones

print d.values()

出力を生成します:

[['100', 'John', 'Jackson', 'M', '08/09/2000'], ['101', 'Jenny', 'Hobbs', 'F', '01/13/1995']]
于 2012-06-07T22:00:15.830 に答える
1

@Maria Zverina に似ていますが、もう少し構造化されています。

import time

data = [
    ['100', 'John', 'Jackson', 'M', '08/09/2000'],
    ['101', 'Jenny', 'Hobbs', 'F', '01/13/1995'],
    ['100', 'John', 'Jackson', 'M', '08/09/1995']
]

# sort by date, ascending
data.sort(key=lambda d: time.strptime(d[4], "%m/%d/%Y"))

# load into a dict, key on ID, later data overwrites earlier
latest = dict((d[0], d) for d in data)

# return to list, sorted by ID
data = sorted(latest.itervalues(), key=lambda d: int(d[0]))

戻り値

# most recent data for each ID, sorted by ID:
[
    ['100', 'John', 'Jackson', 'M', '08/09/2000'],
    ['101', 'Jenny', 'Hobbs', 'F', '01/13/1995']
]
于 2012-06-07T22:32:53.483 に答える
0

必要なことを行うための小さなスクリプトを次に示します。

import time

mylist = [['100', 'John', 'Jackson', 'M', '08/09/2000'],
['101', 'Jenny', 'Hobbs', 'F', '01/13/1995'],
['100', 'John', 'Jackson', 'M', '08/09/1995']]

dict = {} 
for sublist in mylist: 
   id,fname,lname,gender,startdate = sublist 
   if not id in dict: 
      dict[id] = [fname,lname,gender,startdate] 
   else: 
      olddate = dict[id][3] 
      if time.strptime(startdate,'%d/%m/%Y') > time.strptime(olddate,'%d/%m/%Y'): 
         dict[id] = [fname,lname,gender,startdate] 

print dict

Output: {'100': ['John', 'Jackson', 'M', '08/09/2000'], '101': ['Jenny', 'Hobbs', 'F', '01/13/1995']}

最後dictに、最新のレコードを指す一意の ID が含まれます。

于 2012-06-07T22:26:56.627 に答える
0

ここに別の解決策があります。見つけたキーをセットに入れるだけです。orig変数にはリストの元のリストが含まれ、重複resが削除されたリストのリストです。

mod_set  = set()
res = list()
for x in orig:
    if x[0] not in mod_set:
            res.append(x)
            mod_set.add(x[0])
于 2012-06-07T22:15:03.240 に答える