修改非理想列表格式并将其导出到Excel(Python)

时间:2012-08-10 15:30:05

标签: python list export-to-excel

非常新的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等中。)< / em>看起来像:

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后的所需表单 - 绝对最大.i.e忽略' - '符号已排序的绝对最大值

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 

对不起,如果问题很烦人/菜鸟/琐碎。帮助真的很感激。

3 个答案:

答案 0 :(得分: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]

<强> EDIT2

由于您询问了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才有效!

这是* operator派上用场的地方。它会将列表列表分成多个列表。

>>> 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本身进行排序,我们使用列表的排序方法

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

希望这有帮助

答案 1 :(得分: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

答案 2 :(得分: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”是指它们在数据集中出现的顺序排在前三位的整数?

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
...