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は特定のセルの情報を提供します。つまり、aI should getの代わりにb=[1, 2, 5, 6, 7, 9, 10](3 番目のセルは5であるため、列挙が変更されることに注意してください。インデックスが後で9の場合にも同様のことが起こります)。

aからへbの行き方 もっと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 に答える