【问题标题】:Create a new Tuple with one element modified创建一个修改了一个元素的新元组
【发布时间】:2009-11-23 16:56:01
【问题描述】:

(我正在使用 OpenXML SDK 在 IronPython 中与 WordprocessingDocument 对象交互工作,但这确实是一个通用的 Python 问题,应该适用于所有实现)

我正在尝试从一些 Word 文档中刮出一些表格。对于每张桌子, 我有一个迭代器,它给了我表格行对象。然后,我使用以下生成器语句从每一行获取一个单元格元组:

for row in rows:
    t = tuple([c.InnerText for c in row.Descendants[TableCell]()])

每个元组包含 4 个元素。现在,在每个元组的t[1] 列中,我需要对数据应用正则表达式。我知道元组是不可变的,所以我很高兴要么创建一个新元组,要么以不同的方式构建元组。鉴于row.Descendants[TableCell]() 返回一个迭代器,从我想修改返回的nth 元素的迭代器构造元组的最Pythonic(或至少最简单)的方法是什么?

我现在的蛮力方法是从左切片 (t[:n-1])、t[n] 和右切片 (t[n+1:]) 中的修改数据创建一个元组,但我觉得像 itertools 模块应该有什么可以帮助我的。

【问题讨论】:

    标签: python iterator ironpython generator


    【解决方案1】:
    def item(i, v):
      if i != 1: return v
      return strangestuff(v)
    
    for row in rows:
      t = tuple(item(i, c.InnerText)
                for i, c in enumerate(row.Descendants[TableCell]())
               )
    

    【讨论】:

    • 这就是为什么我应该总是在我的办公桌上保留一份“Python in a Nutshell”的副本。我不知道 enumerate 内置,以前从未需要它。在等待响应时,我使用 itertools.izip 和 itertools.count 编写了一个类似的结构。谢谢亚历克斯!
    • @tech&c,不客气!是的,如果不是内置的,你可以合成enumerate,但它是一个经常使用的工具,所以紧凑性和速度通常特别好;-)。
    【解决方案2】:

    我会这样做:

    temp_list = [c.InnerText for c in row.Descendants[TableCell]()]
    temp_list[2] = "Something different"
    t = tuple(temp_list)
    

    它会像这样工作:

    >>> temp_list = [i for i in range(4)]
    >>> temp_list[2] = "Something different"
    >>> t = tuple(temp_list)
    >>> t
    (0, 1, 'Something different', 3)
    

    【讨论】:

      【解决方案3】:

      如果每个元组都包含 4 个元素,那么坦率地说,我认为你最好将它们分配给单个变量,对其进行操作,然后构建你的元组:

      for row in rows:
          t1, t2, t3, t4 = tuple([c.InnerText for c in row.Descendants[TableCell]()])
          t1 = ...
          t = (t1, t2, t3, t4)
      

      【讨论】:

      • 不幸的是,我将使用的列数因表而异,因此我无法将每个列分配给具体变量。
      【解决方案4】:

      我一般都做过,但不喜欢:

      l = 列表(旧元组) l[2] = 富 t = 元组(l)

      我有点想要像 update() 这样的 dicts

      newtuple = update(oldtuple, (None, None, val, None))

      或者也许正确的结构是一个 zip

      newtuple = update(oldtuple, ((2, val), (3, val)))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        相关资源
        最近更新 更多