我在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']
這是字符串格式的任務列表,我需要獲取每個父代下的最後一個子任務。
感謝
我在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']
這是字符串格式的任務列表,我需要獲取每個父代下的最後一個子任務。
感謝
首先,您需要定義比較函數:
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
事後
簡單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函數應當改變。
試試吧在這個列表中出現'['1','1.2','1.3','1.4','11.2']'。做'x [0]'是錯誤的。 – hyades
@hyades fixed。無論如何,我倒像提供廣泛,精確的測試套件是要求的人的責任,如果你只展示最簡單的輸入和最簡單的輸出,你不能期望通用的解決方案 –
謝謝盧卡斯對於答案。 –
你能解釋一下你發佈的這些清單究竟意味着什麼。我無法看到你的確切列表在哪裏 –
這個列表是否總是排序? – shruti1810
這些是任務列表,我從數據庫中獲取字符串格式。例如1是主要任務,1.1是子任務。 –