(我正在使用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]()
返回迭代器,从迭代器构造元组的最Pythonic(或至少最简单)方法是什么,我想修改返回的n
元素?
我现在的蛮力方法是从左侧切片(t[:n-1]
)创建一个元组,在t[n]
和右侧切片(t[n+1:]
)中创建修改后的数据但我觉得像itertools
模块应该有一些东西可以帮助我。
答案 0 :(得分: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]())
)
答案 1 :(得分: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)
答案 2 :(得分: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)
答案 3 :(得分:0)
我一般都做了,但不是粉丝:
l = list(oldtuple) l [2] = foo t =元组(l)
我有点像dicts的update()
newtuple = update(oldtuple,(None,None,val,None))
或许正确的结构是拉链
newtuple = update(oldtuple,((2,val),(3,val)))