将迭代数组值添加到 xlwt sheet
Adding iterated array values to xlwt sheet
对于此数组中的每 4 个值,我希望它写入电子表格中的新行,同时忽略第一列。这是因为我将把来自单独数组的不同值放在那里。
比如我有五列:
A B C D E
但是 A 是禁区...
我有一个数字 1-12 的数组,我想这样写:
A B C D E
1 2 3 4
5 6 7 8
9 10 11 12
在我的真实代码中,数字实际上不会按顺序排列,因此为什么这里可能必须使用某种形式的迭代而不是依赖于特定值的逻辑。
我在测试代码中接近类似这样的东西,但是 8 之后的值开始变得奇怪,我假设它指的是 4 作为数组的成员而不是长度条件...
s1 = wb.add_sheet("Test")
s1.write(0, 0, "Col 1")
s1.write(0, 1, "Col 2")
s1.write(0, 2, "Col 3")
s1.write(0, 3, "Col 4")
s1.write(0, 4, "Col 5")
test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
list2 = []
for val in test_list:
list2.append(str(val))
for c, col_val in enumerate(list2):
for r, row_val in enumerate(col_val):
if c + 1 > 4:
s1.write(r + 1 + 1, c - 4 + 1, row_val)
if c + 1 <= 4:
s1.write(1, 1 + c, row_val)
如果谁有好的方法,请告诉我。
为了解决这个问题,我使用了 2 个发电机。一个生成器给我应该写的下一列,另一个生成器给我应该写的下一行。生成器可能听起来令人生畏,但在这里它们确实简化了您面临的问题(优点是内存占用量略低)。
关键思想
(5 列的示例)
- 您写入的列号遵循顺序 1,2,3,4,1,2,3,4..
- 您要写入的行号遵循顺序 1,1,1,1,2,2,2,2,...
所以你看到规律了吗?列和行都是独立的序列,可以使用生成器或简单循环获得。 (虽然这会占用更多内存)
工作代码
s1 = wb.add_sheet("Test")
s1.write(0, 0, "Col 1")
s1.write(0, 1, "Col 2")
s1.write(0, 2, "Col 3")
s1.write(0, 3, "Col 4")
s1.write(0, 4, "Col 5")
test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
list2 = []
for val in test_list:
list2.append(str(val))
# Generator for column
def next_c_index():
c = [1, 2, 3, 4]
while True:
for i in c:
yield i
# Generator for row
def next_r_index(ncolumns=5):
"""
Assumes you start from writing from 2nd row.
:ncolumns = number of columns (default 5)
Eg. 1, 1, 1, 1, 2, 2, 2, 2
"""
n = 0
r = 0
while True:
# In every cycle of 4
if (n)%(ncolumns-1)==0:
r += 1
n += 1
yield r
# Since you have 5 columns I pass 5 while calling row generator
row = next_r_index(ncolumns=5)
col = next_c_index()
for val in list2:
s1.write(row.next(), col.next(), val)
对于此数组中的每 4 个值,我希望它写入电子表格中的新行,同时忽略第一列。这是因为我将把来自单独数组的不同值放在那里。
比如我有五列:
A B C D E
但是 A 是禁区...
我有一个数字 1-12 的数组,我想这样写:
A B C D E
1 2 3 4
5 6 7 8
9 10 11 12
在我的真实代码中,数字实际上不会按顺序排列,因此为什么这里可能必须使用某种形式的迭代而不是依赖于特定值的逻辑。
我在测试代码中接近类似这样的东西,但是 8 之后的值开始变得奇怪,我假设它指的是 4 作为数组的成员而不是长度条件...
s1 = wb.add_sheet("Test")
s1.write(0, 0, "Col 1")
s1.write(0, 1, "Col 2")
s1.write(0, 2, "Col 3")
s1.write(0, 3, "Col 4")
s1.write(0, 4, "Col 5")
test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
list2 = []
for val in test_list:
list2.append(str(val))
for c, col_val in enumerate(list2):
for r, row_val in enumerate(col_val):
if c + 1 > 4:
s1.write(r + 1 + 1, c - 4 + 1, row_val)
if c + 1 <= 4:
s1.write(1, 1 + c, row_val)
如果谁有好的方法,请告诉我。
为了解决这个问题,我使用了 2 个发电机。一个生成器给我应该写的下一列,另一个生成器给我应该写的下一行。生成器可能听起来令人生畏,但在这里它们确实简化了您面临的问题(优点是内存占用量略低)。
关键思想
(5 列的示例)
- 您写入的列号遵循顺序 1,2,3,4,1,2,3,4..
- 您要写入的行号遵循顺序 1,1,1,1,2,2,2,2,...
所以你看到规律了吗?列和行都是独立的序列,可以使用生成器或简单循环获得。 (虽然这会占用更多内存)
工作代码
s1 = wb.add_sheet("Test")
s1.write(0, 0, "Col 1")
s1.write(0, 1, "Col 2")
s1.write(0, 2, "Col 3")
s1.write(0, 3, "Col 4")
s1.write(0, 4, "Col 5")
test_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
list2 = []
for val in test_list:
list2.append(str(val))
# Generator for column
def next_c_index():
c = [1, 2, 3, 4]
while True:
for i in c:
yield i
# Generator for row
def next_r_index(ncolumns=5):
"""
Assumes you start from writing from 2nd row.
:ncolumns = number of columns (default 5)
Eg. 1, 1, 1, 1, 2, 2, 2, 2
"""
n = 0
r = 0
while True:
# In every cycle of 4
if (n)%(ncolumns-1)==0:
r += 1
n += 1
yield r
# Since you have 5 columns I pass 5 while calling row generator
row = next_r_index(ncolumns=5)
col = next_c_index()
for val in list2:
s1.write(row.next(), col.next(), val)