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

时间:2009-11-23 16:56:01

标签: python iterator ironpython generator

(我正在使用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模块应该有一些东西可以帮助我。

4 个答案:

答案 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)))