对于此数组中的每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)
如果有人有办法实现这一目标,请告诉我。
答案 0 :(得分:1)
为了解决这个问题,我选了2台发电机。一个生成器给了我应该写的下一列,另一个生成器给了我应该写的下一行。发电机可能听起来令人生畏,但在这里它们确实简化了您所面临的问题(具有略低的内存占用优势)。
关键理念
(5列示例)
所以你看到了这种模式?列和行都是独立的序列,可以使用生成器或简单循环获得。 (这会占用更多的记忆)
工作代码
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)