2015-05-14 52 views
1

我在python有一個列表這樣Python的方式漂浮

list = ['1', '1.1', '1.2', '1.3','1.4', '2', '2.1', '2.2', '3', '3.1', '3.2'] 

我能得到這樣的結果

['1', '1.4', '2', '2.2', '3', '3.2'] 

['1.4', '2.2', '3.2'] 

這是字符串格式的任務列表,我需要獲取每個父代下的最後一個子任務。

感謝

+1

你能解釋一下你發佈的這些清單究竟意味着什麼。我無法看到你的確切列表在哪裏 –

+1

這個列表是否總是排序? – shruti1810

+0

這些是任務列表,我從數據庫中獲取字符串格式。例如1是主要任務,1.1是子任務。 –

回答

4

首先,您需要定義比較函數:

def cmp_tasks(a,b): 
    a = a.split('.') 
    b = b.split('.') 
    if len(a) == len(b): 
     ret = cmp(int(a[0]),int(b[0])) 
     if not ret: 
      return cmp(int(a[1]),int(b[1])) 
     return ret 
    else: 
     return cmp(int(a[0]),int(b[0])) 

則:

一個內膽:

>>> {int(float(i)):i for i in sorted(l,cmp=cmp_tasks)}.values() 
['1.30', '2.2', '3.2'] 

您可以在一個班輪做到這一點

詳細的方法:
,或者更詳細的:首先需要組的值根據它們的地板值:

l = ['1', '1.30', '1.1', '1.2', '1.3','1.4', '2', '2.1', '2.2', '3', '3.1', '3.2'] 
groups = {} 
for i in l: 
    groups.setdefault(int(float(i)),[]).append(i) 

現在

>>> groups 
{1: ['1','1.30', '1.1', '1.2', '1.3', '1.4'], 2: ['2', '2.1', '2.2'], 3: ['3', '3.1', '3.2']} 

然後就可以從各組取最大值:

>>> [sorted(g,cmp=cmp_tasks)[-1] for g in groups.values()] 
['1.30', '2.2', '3.2'] 

ps 注意重載list關鍵字是不是一個好主意,因爲你將無法使用list事後

+0

儘管問題有點不清楚,但是從你的邏輯1.4開始會在1.30之前,因爲int(1.3) hyades

+0

我已經被投票否決了這個問題。任何人都可以幫助 –

+0

也許最好更清楚地解釋你的問題。 – Elisha

2

簡單itertools解決方案:

import itertools 
l = ['1', '1.1', '1.2', '1.3','1.4', '2', '2.1', '2.2', '3', '3.1', '3.2', '11', '11.1'] 
assert [list(group)[-1] for category, group in itertools.groupby(l, lambda x: x.split('.')[0])] == ['1.4', '2.2', '3.2', '11.1'] 

對於不同形式的輸入數據lambda函數應當改變。

+0

試試吧在這個列表中出現'['1','1.2','1.3','1.4','11.2']'。做'x [0]'是錯誤的。 – hyades

+0

@hyades fixed。無論如何,我倒像提供廣泛,精確的測試套件是要求的人的責任,如果你只展示最簡單的輸入和最簡單的輸出,你不能期望通用的解決方案 –

+0

謝謝盧卡斯對於答案。 –