3

(我正在使用 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]()返回一个迭代器,从我想要修改n返回的第 th 个元素的迭代器构造元组的最 Pythonic(或至少最简单)的方法是什么?

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

4

4 回答 4

6
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]())
           )
于 2009-11-23T17:12:21.803 回答
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)
于 2009-11-23T17:55:22.887 回答
1

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

for row in rows:
    t1, t2, t3, t4 = tuple([c.InnerText for c in row.Descendants[TableCell]()])
    t1 = ...
    t = (t1, t2, t3, t4)
于 2009-11-23T17:06:39.443 回答
0

我通常做了什么,但我不喜欢:

l = list(oldtuple) l[2] = foo t = tuple(l)

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

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

或者也许正确的结构是拉链

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

于 2010-01-07T18:45:59.400 回答