【问题标题】:Adding iterated array values to xlwt sheet将迭代数组值添加到 xlwt 工作表
【发布时间】:2015-05-06 08:48:21
【问题描述】:

对于此数组中的每 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)

如果有人有实现此目的的好方法,请告诉我。

【问题讨论】:

    标签: python arrays excel for-loop xlwt


    【解决方案1】:

    为了解决这个问题,我使用了 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)
    

    【讨论】:

    • 谢谢,这是完美的。我正在考虑尝试创建某种功能来进一步分解这种情况,而不是我与 for 循环的拼命斗争。我将不得不多读一些关于生成器的文章。
    • @chrisl0lz:使用我上面提到的序列键思想,您也可以对 for 循环执行相同的操作。生成器只是让它变得很酷,因为我们不必定义固定大小的序列,然后考虑在哪里停止迭代等等。:)
    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2012-08-27
    • 2022-01-13
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多