创建一个元素修改的新元组
我正在用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]())
)
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。