2015-05-14 32 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

谢谢卢卡斯对于答案。 –