Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python获取包含整数和浮点数的列表最大值的方法_Python_List_Max - Fatal编程技术网

Python获取包含整数和浮点数的列表最大值的方法

Python获取包含整数和浮点数的列表最大值的方法,python,list,max,Python,List,Max,我在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'] 或 这是一个字符串格式的任务列表,我需要获取每个父任务下的最后一个子任务 谢谢首先您需要定义比较函数: def cmp_tasks(a,b): a = a.split('.') b = b.spl

我在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']

这是一个字符串格式的任务列表,我需要获取每个父任务下的最后一个子任务


谢谢

首先您需要定义比较函数:

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)
现在

然后您可以从每组中取最大值:

>>> [sorted(g,cmp=cmp_tasks)[-1] for g in groups.values()]
['1.30', '2.2', '3.2']
p.s.
请注意,覆盖
列表
关键字不是一个好主意,因为之后将无法使用
列表
,首先需要定义比较函数:

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)
现在

然后您可以从每组中取最大值:

>>> [sorted(g,cmp=cmp_tasks)[-1] for g in groups.values()]
['1.30', '2.2', '3.2']
p.s.
请注意,覆盖
列表
关键字不是一个好主意,因为您将无法在以后使用
列表

简单的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函数。

简单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函数。

您能解释一下您发布的列表到底意味着什么吗。我很难看到你们从哪里得到这些精确的列表。这个列表会一直被排序吗?这些是任务列表,我从db得到的字符串格式。例如,1是一个主要级别的任务,1.1是一个子任务。你能解释一下你发布的那些列表到底意味着什么吗。我很难看到你们从哪里得到这些精确的列表。这个列表会一直被排序吗?这些是任务列表,我从db得到的字符串格式。例如,1是一个主要级别的任务,1.1是一个子任务。虽然问题有点不清楚,但从你的逻辑来看,1.4会在1.30之前出现,因为
int(1.3)
我问这个问题被否决了。谁能help@Elisha您的两种方法都是错误的,因为对于列表
['1','1.1','1.2','1.3','1.4','1.30']
,两种解决方案都返回
1.4
,而
1.30
将是最后一个子任务。您确定1.30应该在1.4之后吗?从这个问题上看,你还不清楚1.30还能代表什么?你不能说它与1.3相同。这就是它被作为字符串而不是普通整数给出的原因。此外,任务始终是数字1,1.1,1.2…1.10,1.11,1.12@user11283请确认虽然问题有点不清楚,但从您的逻辑来看,1.4将出现在1.30之前,因为
int(1.3)
我因提出此问题而被否决。谁能help@Elisha您的两种方法都是错误的,因为对于列表
['1','1.1','1.2','1.3','1.4','1.30']
,两种解决方案都返回
1.4
,而
1.30
将是最后一个子任务。您确定1.30应该在1.4之后吗?从这个问题上看,你还不清楚1.30还能代表什么?你不能说它与1.3相同。这就是它被作为字符串而不是普通整数给出的原因。此外,任务始终是数字1,1.1,1.2…1.10,1.11,1.12@用户11283请确认使用此列表进行尝试
['1','1.2','1.3','1.4','11.2']
。执行
x[0]
是错误的。@hyades已修复。不管怎样,我觉得提供广泛、精确的测试套件是提出要求的人的责任。如果您只显示最简单的输入和最简单的输出,那么您就无法期望通用解决方案。感谢Lukasz的回答。请使用以下列表进行尝试
['1','1.2','1.3','1.4','11.2']
。执行
x[0]
是错误的。@hyades已修复。不管怎样,我觉得提供广泛、精确的测试套件是提出要求的人的责任。如果你只显示最简单的输入和最简单的输出,你就不能期望通用的解决方案。谢谢你卢卡斯的回答。