1

我正在为 XML 电子表格中的给定公式构建参考地图的任务。例如,对于以下行:

<row>
    <cell></cell>
    <cell></cell>
    <cell index="5"></cell>
    <cell></cell>
    <cell></cell>
    <cell index="9"></cell>
    <cell></cell>
    ......
</row>

如果我使用enumerate(row.findall("cell"))它将返回a=[1, 2, 3, 4, 5, 6, 7]。但是,该属性index提供特定单元格的信息。也就是说,而不是a我应该得到b=[1, 2, 5, 6, 7, 9, 10](注意第三个单元格是5,所以它改变了枚举,类似的事情发生在索引为9之后)。

我如何从ab?我想要一个更 Pythonic 的程序。我现在拥有的类似 C 的语法(我有点厌烦):

testcases = [[1, 2, 5, 4, 5, 9, 8], [5, 4, 5, 9, 8], [1, 2, 5, 4, 5, 9]]

for cells in testcases:
    first = None
    for i, c in enumerate(cells):
        if c>i+1:
            first = c

        if i>0 and c < cells[i-1]:
            cells[i]=cells[i-1]+1
        elif i>0 and c> cells[i-1]+1 and first is None:
            first=c
            for j in range(i)[::-1]:
                cells[j]=c-1
                c=c-1
    print(cells)
4

2 回答 2

1

我无法完全理解您的问题,但这可能是您需要的起点:

matrix = [[1, 2, 5, 4, 5, 9, 8], [5, 4, 5, 9, 8], [1, 2, 5, 4, 5, 9]]

for rowid, cellid, cell in [(rowid, cellid, cell) for rowid, row in enumerate(matrix) for cellid, cell in enumerate(row)]:
    print "matrix[%d, %d]: %s" % (rowid, cellid, cell)

这将遍历整个矩阵,打印所有单元格并让您访问所有行和单元格 ID。

于 2012-10-17T10:04:46.140 回答
0

我认为enumerate有点偏离你想要解决的问题。您必须考虑 findall返回一个 列表elements,您可以从中检索它们的属性并使用它们来填充值。

因此,鉴于您提供的 XML 示例和您期望的输出,以下代码段允许您获取考虑索引的单元格列表(只要单元格有它):

from lxml import etree

tag = etree.fromstring('''<row>
                             <cell></cell><cell></cell>
                             <cell index="5">
                             </cell><cell></cell><cell></cell>
                             <cell index="9"></cell>
                             <cell></cell>
                          </row>''')

index = 1
result = []
for cell in tag.findall('cell'):
    index = int(cell.attrib['index']) if cell.attrib.has_key('index') else index
    result.append(index)
    index += 1

print result

结果是:

[1, 2, 5, 6, 7, 9, 10]
于 2012-10-17T21:42:04.263 回答