Python列表理解具有可变长度的多个元素?

Fra*_*ris 2 python list-comprehension python-2.7

我正在编写代码将CSV转换为XML.假设我有一个列表,如:

input = ['name', 'val', 0, \
         'name', 'val', 1, 'tag', 'val', \
         'name', 'val', 2, 'tag', 'val', 'tag', 'val', \
         'name', 'val', 0]
Run Code Online (Sandbox Code Playgroud)

此列表的每个切片以"name"开头,表示具有名称,值和可变标记值对的可变数量的元素.

我想把它变成:

output = [['name', 'val', []], 
          ['name', 'val', ['tag', 'val']],
          ['name', 'val', ['tag', 'val', 'tag', 'val']],
          ['name', 'val', []]]
Run Code Online (Sandbox Code Playgroud)

无需将标记值对分隔为元组,这是在单独的方法中处理的.我有一个解决方案,但它不是非常pythonic:

output=[]
cursor=0

while cursor < len(input):
    name=input[cursor]
    val=input[cursor+1]
    ntags=int(input[cursor+2])
    optslice=input[cursor+3:cursor+3+2*ntags]
    cursor = cursor+3+2*ntags
    print name, val, ntags, optslice, cursor
    output.append([name, val, optslice])    
print output

> name val 0 [] 3
> name val 1 ['tag', 'val'] 8
> name val 2 ['tag', 'val', 'tag', 'val'] 15
> name val 0 [] 18

> [['name', 'val', []], ['name', 'val', ['tag', 'val']], ['name', 'val', ['tag', 'val', 'tag', 'val']], ['name', 'val', []]]
Run Code Online (Sandbox Code Playgroud)

我想我可能会把它作为一个列表理解,但是每个元素的可变长度都会让我失去一个循环.输入是从CSV解析的,我可以更改格式以更好地适应不同的解决方案.想法?

Ste*_*ann 6

我将使用迭代器而不是光标,然后用它来驱动理解for name in it.

it = iter(input)
output = [[name, next(it), [next(it) for _ in range(2 * next(it))]] for name in it]
Run Code Online (Sandbox Code Playgroud)

或者islice:

from itertools import islice

it = iter(input)
output = [[name, next(it), list(islice(it, 2 * next(it)))] for name in it]
Run Code Online (Sandbox Code Playgroud)

也就是说,我怀疑你不应该首先在平面列表中包含所有数据.可能您的CSV文件具有您应该使用的结构.即,不要将二维数据展平,因此您需要将其展开.但你的问题很有意思:-)