3

对 Python 非常陌生,无意侮辱任何人的智商。

我有一个大列表,包含一系列 id 和相关值,极短的版本如下所示:

large = [('550111', [(4, 5, 8), (6, -4, -6)]), ('222211', [(2, -4, 5), (1, 15, -4)])]

我有这样的代码,可以将理想格式导出到 Excel,但是没有进行所需的修改:

import csv
with open("out1.csv", "wb") as fp: 
 writer = csv.writer(fp, delimiter=",")     
for entry in large:        
 writer.writerow([entry[0]])         
for line in entry[1]:             
 writer.writerow(line)        
 writer.writerow([])

从此输出到 Excel (每个值都有自己的单独单元格 - 5501 在 A1 中,4 在 A2 中,5 在 B2 中,8 在 C2 中......第一个空格将在 A4 中等)看起来像:

550111 
4,5,8 
6,-4,-6  
<space here - dont know how to put them in>
222211 
2,4,-5 
1,-15, 4 
 <space here - dont know how to put them in>

这是完美的,但是我也希望产生值的绝对最大值。这是我需要帮助的地方。我不知道如何将绝对最大函数写入导出代码,因为我不断收到错误消息说我无法将函数应用于列表。

我还需要在最后插入一个从 1 到 8904 的数字序列。

导出到 Excel 后所需的形式 - 具有绝对最大值 .ie ignoreinf '-' 符号排序的绝对最大值

550111 
4,5,8 
6,-4,-6
'space here'
'Max:'
6, 5, 8
'Sorted max'
8, 6, 5
'space here'     
222211 
2,4,-5 
1,-15,4
'space here'
'Max:'
2, 15, 5
'Sorted max:' 
15, 5, 2
'space here'
1, 2, 3, ........, 8904 

抱歉,如果问题很烦人/新手/琐碎。帮助真的很感激。

4

3 回答 3

2

我认为以下代码片段可以帮助您获取最大值和排序的最大值。抱歉,虽然无法帮助您将它们放入 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

希望这可以帮助

于 2012-08-14T10:58:07.903 回答
0

不确定这是python还是excel问题,但在excel中:“一步内一个范围内绝对值的最大值”的函数是:

=MAX(INDEX(ABS(F17:F22),0,1))

我不熟悉python,但我确信有一种方法可以将公式插入到单元格中——所以我将把它留给你或其他人来回答。祝你好运。

来源: http ://www.mrexcel.com/forum/showthread.php?47999-Maximum-of-absolute-values-within-a-range-in-one-step

https://groups.google.com/forum/?fromgroups#!topic/python-excel/bRDXSVWstxo%5B1-25%5D

于 2012-08-10T16:32:09.703 回答
0

使用xlwt模块,您可以直接导出为二进制 Excel 文件格式而不是 CSV,以便使用动态 Excel 公式。

这适用于 65k 行以下的电子表格(xlwt 使用的古代 Excel 格式的限制)。

[更新]

我不确定我明白你想要什么。如果你想计算最大值,就这样做。

import csv
with open("out1.csv", "wb") as fp: 
    writer = csv.writer(fp, delimiter=",")
    for entry, data in large:
        values = []
        writer.writerow([entry])
        for line in data:             
            writer.writerow(line)
            values.extend(line)
        writer.writerow([])
        writer.writerow(['Sorted Max'])
        writer.writerow(sorted(values, reverse=True)[:3])
        writer.writerow([])

[更新]

这里不欢迎长串评论,所以我要求将其移至聊天室。请注意,我有自己的工作要做,可能需要几分钟才能回答。记住,我是自愿帮助你的……如果你值得我的帮助,我值得你的耐心。

通过“abs max”,您的意思是前 3 个整数与它们在数据集中出现的顺序相同吗?

top3 = sorted(values, reverse=True)[:3]
absmax = filter(lambda x: x in top3, values)

“最后”是指右边的几列?使用 xlwt 模块,您可以精确控制行/列 - 但使用 csv 模块,您必须自己填充列。请根据您的用例调整以下示例:

c = 1
for a in range(10):
    writer.writerow([a, ' ', ' ', c])
    c += 1
    writer.writerow([a+1, a+2, a+3, c])
    c += 1
    writer.writerow([' ', ' ', ' ', c])
    c += 1

结果:

0, , ,1
1,2,3,2
 , , ,3
1, , ,4
2,3,4,5
 , , ,6
2, , ,7
3,4,5,8
 , , ,9
...
于 2012-08-14T08:21:31.900 回答