创建一个元素修改的新元组

3 投票
4 回答
2675 浏览
提问于 2025-04-15 16:18

我正在用IronPython和OpenXML SDK与一个WordprocessingDocument对象进行交互,但这其实是一个普遍的Python问题,应该适用于所有的实现。

我想从一些Word文档中提取表格。对于每个表格,我有一个迭代器,它给我返回表格行对象。然后,我使用以下生成器语句从每一行获取一个包含单元格的元组:

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

每个元组包含4个元素。现在,在每个元组的第t[1]列中,我需要对数据应用一个正则表达式。我知道元组是不可变的,所以我可以选择创建一个新的元组,或者用其他方式构建这个元组。考虑到row.Descendants[TableCell]()返回的是一个迭代器,最Pythonic(或者说最简单)的方式来从这个迭代器构建一个元组,并且我想修改第n个返回的元素,应该是什么呢?

我现在的笨办法是从左边的切片(t[:n-1])、修改后的数据(t[n])和右边的切片(t[n+1:])创建一个元组,但我觉得itertools模块应该有一些方法可以帮我解决这个问题。

4 个回答

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)
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)
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]())
           )

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答