非常新的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
对不起,如果问题很烦人/菜鸟/琐碎。帮助真的很感激。
答案 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,但我确信有一种方法可以将公式插入到单元格中 - 所以我会将其留给您或其他人来回答。祝你好运。
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
...