我有以下列表:
erra_eus_repo = [(u'RHSA-2017:2796', u'6.7'), (u'RHSA-2017:2796', u'6.8'), (u'RHSA-2017:2794', u'7.2'), (u'RHSA-2017:2793', u'7.3')]
我想从每个floating
获取tuple
点数:
6.7, 6.8 ,7.2, 7.3
并获取点.ie之前的每个版本的最大数量:
new_list = [ 6.8, 7.3 ]
注意max()
在这里不起作用,因为如果我有5.9和5.11,我将得到最大值为5.9,我希望结果为5.11,因为11> 9。
我尝试过:
eus_major = []
eus_minor = []
for major in erra_eus_repo:
minor = (major[1][2])
major = (major[1][0])
if major not in eus_major:
eus_major.append(major)
if minor not in eus_minor:
eus_minor.append(minor)
print(eus_major, eus_minor)
目前我正在接受:
[u'6', u'7'] [u'7', u'2', u'3']
答案 0 :(得分:2)
例如,您可以使用groupby
和排序:
from itertools import groupby
srt_list = sorted(erra_eus_repo, key=lambda x: x[1]);
max_list = []
for key, group in groupby(srt_list, lambda x: x[1].split('.')[0]):
max_el = max(list(group), key = lambda y: int(y[1].split('.')[1]))
max_list.append(float(max_el[1]))
首先,基于每个元组的第二个元素对数组进行排序,以获得具有匹配的非十进制数的元素序列,以便与groupby
进行分组。 groupby
将元素分组为 - 每个组将表示具有公共X的序列X.Z。在每个序列中 - 程序组找到具有最大小数部分的组作为独立数字。然后将整个数字附加到列表中,最大值为浮点数。
答案 1 :(得分:0)
不要将版本号视为浮点数,视为'。'分开的字符串然后拆分每个版本字符串(拆分为'。')并进行比较。像这样:
def normalize_version(v):
return tuple(map(int, v.split('.')))
然后你可以看到:
>>> u'5.11' > u'5.9'
False
>>> normalize_version(u'5.11') > normalize_version(u'5.9')
True
答案 2 :(得分:0)
以下是对每个RHSA值提供最高价值的问题的另一种看法(我希望你以后会这样做):
erra_eus_repo = [(u'RHSA-2017:2796', u'6.7'), (u'RHSA-2017:2796', u'6.8'), (u'RHSA-2017:2794', u'7.2'), (u'RHSA-2017:2793', u'7.3')]
eus_major = {}
for r in erra_eus_repo:
if r[0] not in eus_major.keys():
eus_major[r[0]] = 0
if float(r[1]) > float(eus_major[r[0]]):
eus_major[r[0]] = r[1]
print(eus_major)
输出:
{'RHSA-2017:2796': '6.8', 'RHSA-2017:2794': '7.2', 'RHSA-2017:2793': '7.3'}
我将值保留为字符串,但可以很容易地将其转换为浮点数。
答案 3 :(得分:0)
以下内容仅使用内置的min
和max
函数:
erra_eus_repo = [(u'RHSA-2017:2796', u'6.7'),
(u'RHSA-2017:2796', u'6.8'),
(u'RHSA-2017:2794', u'7.2'),
(u'RHSA-2017:2793', u'7.3')]
eus_major = max(float(major[1])for major in erra_eus_repo)
eus_minor = min(float(major[1])for major in erra_eus_repo)
newlist = [eus_minor, eus_major]
print(newlist) # -> [6.7, 7.3]
答案 4 :(得分:0)
这可能看起来像是在尝试比较小数值,但实际上并非如此。不用说(但我会),而9< 11,.9> .11。因此,将数字拆分为两个单独的值的想法实际上是获得有效比较的唯一方法。
列表是一个列表列表 - 您拥有主列表,每个列表都有一个RHSA子列表和一个值。显然你想丢弃列表中的第一个项目,只得到该项目的(我假设)版本。这里有一些代码,虽然粗略,但会让你知道该怎么做。 (我欢迎评论如何清理它...)所以我已经取了列表,拆分它们,然后将版本分成主要和次要,然后比较它们,如果列表中没有任何内容,添加值。为了测试6.11版本号,我还添加了。
lstVersion = []
lstMaxVersion=[]
erra_eus_repo = [(u'RHSA-2017:2796', u'6.7'), (u'RHSA-2017:2796', u'6.8'), (u'RHSA-2017:2796', u'6.11'), (u'RHSA-2017:2794', u'7.2'), (u'RHSA-2017:2793', u'7.3')]
for strItem in erra_eus_repo:
lstVersion.append(strItem[1])
for strVersion in lstVersion:
blnAdded = False
intMajor = int(strVersion.split('.')[0])
intMinor = int(strVersion.split('.')[1])
print 'intMajor: ', intMajor
print 'intMinor:' , intMinor
for strMaxItem in lstMaxVersion:
intMaxMajor = int(strMaxItem.split('.')[0])
intMaxMinor = int(strMaxItem.split('.')[1])
print 'strMaxitem: ', strMaxItem
print 'intMaxMajor: ', intMaxMajor
print 'intMaxMinor: ', intMaxMinor
if intMajor == intMaxMajor:
blnAdded = True
if intMinor > intMaxMinor:
lstMaxVersion.remove(strMaxItem)
lstMaxVersion.append(str(intMajor)+'.'+str(intMinor))
if not blnAdded:
lstMaxVersion.append(str(intMajor)+'.'+str(intMinor))