我认为以下代码片段可以帮助您获取最大值和排序的最大值。抱歉,虽然无法帮助您将它们放入 excel 中
for entry in large:
max_list=[]
for z in zip(*entry[1]):
max_list.append(max(z))
print max_list
max_list.sort(reverse=True)
print max_list
[6, 5, 8]
[8, 6, 5]
[2, 15, 5]
[15, 5, 2]
基本上,对于大型数据集中的每个条目,您必须处理条目1列表(这是一个元组列表)。使用 zip 您可以同时“压缩”多个数据结构。
zip(*entry[1])
这一行基本上展开列表中的所有元组并同时循环它们。因此,在第一次迭代期间,所有元组的所有第一个元素都被选择并存储为一个元组。
使用 max 函数,您可以获得最大值并将其存储在单独的列表中(每个条目的新列表)。然后你可以对该列表进行反向排序以获得你想要的
编辑
刚刚注意到你需要绝对最大值。所以代码片段被修改为
for entry in large:
max_list=[]
for z in zip(*entry[1]):
max_list.append(max(abs(t) for t in z))
print "Absolute max",max_list
max_list.sort(reverse=True)
print "Sorted Absolute Max",max_list
输入
large = [('5501', [(4, -5, 8), (6, -4, -6)]), ('2222', [(2, -4, 5), (1, -15, -4)])]
输出
Absolute max [6, 5, 8]
Sorted Absolute Max [8, 6, 5]
Absolute max [2, 15, 5]
Sorted Absolute Max [15, 5, 2]
编辑2
既然您询问了 zip 和编辑后的代码,我将尝试解释这一点。
zip()是一个内置的 python 函数,它可以帮助您并行地迭代多个可迭代对象(列表、元组和任何其他可以迭代的东西)。
>>> a=[1,2,3,]
>>> b=[4,5,6,]
>>> zip(a,b)
[(1, 4), (2, 5), (3, 6)]
结果的第 i 个元组是输入列表的第 i 个元素的集合
在您的情况下entry[1]
,是您想要“压缩”的元组列表,但只有当我们给它多个列表而不是单个列表列表时,zip 才有效!
这就是* 运算符派上用场的地方。它会将您的列表列表拆分为多个列表。
>>> def printme(*a):
... for i in a:
... print i
...
>>> m=[(1,2,),(3,4,),(5,6,),]
>>> printme(m)
[(1, 2), (3, 4), (5, 6)]
>>> printme(*m)
(1, 2)
(3, 4)
(5, 6)
如果你想在一个列表中找到最大值,你可以使用内置的max()函数。
现在我们拥有解决您的问题所需的所有理论要素。让我们说
>>> entry=('5501', [(4, -5, 8), (6, -4, -6)])
>>> entry[1]
[(4, -5, 8), (6, -4, -6)]
您要做的是压缩这些元组,以便所有第一个元素形成一个单独的元组,所有第二个元素形成一个单独的元组,依此类推。
>>> zip(entry[1])
[((4, -5, 8),), ((6, -4, -6),)]
不好!!!让我们使用*
>>> zip(*entry[1])
[(4, 6), (-5, -4), (8, -6)]
完美的!现在对于列表中的每个元组,我们需要做的就是执行 max() 来找出最大值并将其存储在某个地方。
>>> for z in zip(*entry[1]):
... print "I have",z
... print "max is",max(z)
...
I have (4, 6)
max is 6
I have (-5, -4)
max is -4
I have (8, -6)
max is 8
因此,如果我们初始化一个空列表并将最大值附加到它,我们将得到最大值列表!因此,我写的第一个代码
max_list=[]
for z in zip(*entry[1]):
max_list.append(max(z))
print max_list
给我们
[6, -4, 8]
为了对 max_list 本身进行排序,我们使用列表的 sort 方法
max_list.sort(reverse=True)
print max_list
给我们
[8, 6, -4]
但是我们需要值的绝对最大值。
在上面的代码片段中,z
, 保存值。所以我们需要一种将这些值转换为绝对值的方法。内置abs()仅适用于数字,因此我们需要将其应用于 z 的每个元素
>>> for z in zip(*entry[1]):
... print z
... new_z = []
... for i in z:
... new_z.append(abs(i))
... print new_z
...
(4, 6)
[4, 6]
(-5, -4)
[5, 4]
(8, -6)
[8, 6]
或者我们可以是 pythonic 并将其缩短为
>>> for z in zip(*entry[1]):
... print z
... new_z=[abs(i) for i in z]
... print new_z
...
(4, 6)
[4, 6]
(-5, -4)
[5, 4]
(8, -6)
[8, 6]
但我们还需要 的最大值new_z
。这很容易max(new_z)
。我们现在的代码是
max_list=[]
for z in zip(*entry[1]):
new_z=[abs(i) for i in z]
max_list.append(max(new_z))
print max_list
这给了我们
[6, 5, 8]
这就是我们想要的。但是等等,我们仍然可以缩短代码
new_z=[abs(i) for i in z]
max_list.append(max(new_z))
可以转换为单行
max_list.append(max( abs(t) for t in z ))
这将我们带到了最终代码
for entry in large:
max_list=[]
for z in zip(*entry[1]):
max_list.append(max(abs(t) for t in z))
print "Absolute max",max_list
max_list.sort(reverse=True)
print "Sorted Absolute Max",max_list
希望这可以帮助