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

2024-10-03 21:24:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写将CSV转换为XML的代码。假设我有一个单子,比如:

input = ['name', 'val', 0, \
         'name', 'val', 1, 'tag', 'val', \
         'name', 'val', 2, 'tag', 'val', 'tag', 'val', \
         'name', 'val', 0]

此列表中以“name”开头的每个部分都表示一个元素,该元素具有名称、值和可选标记-值对的可变数量。在

我想把它变成:

^{pr2}$

不需要将标记-值对分离为元组,这是在单独的方法中处理的。我有一个解决办法,但不是很像Python:

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', []]]

我想我可以把它作为一个列表理解来做,但是每个元素的可变长度让我陷入了一个循环。输入是从CSV解析的,我可以更改格式以更好地适应不同的解决方案。思想?在


Tags: csv代码name标记元素列表inputoutput
3条回答

我不知道你是怎么想的,但你可以这样做

finallist = []
therest = x

while therest:
    name, val, count, *therest = therest
    sublist, therest = rest[:2*count], rest[2*count:]
    finallist.append([name, val] + [sublist])

这是我的代码:

data = ['name', 'val', 0,
        'name', 'val', 1, 'tag', 'val',
        'name', 'val', 2, 'tag', 'val', 'tag', 'val',
        'name', 'val', 0]

tmp = [
    [
        data[pos:pos + 2],
        [i for i in data[pos + 3:pos + 3 + data[pos + 2] * 2]]
    ] for pos, e in enumerate(data) if e == 'name']

for e in tmp:
    print e

输出为:

^{pr2}$

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

it = iter(input)
output = [[name, next(it), [next(it) for _ in range(2 * next(it))]] for name in it]

或使用islice

^{pr2}$

也就是说,我怀疑你不应该把所有的数据都放在这个简单的列表中。可能你的CSV文件有你应该使用的结构。一、 例如,不要为了你需要把二维数据展平。但你的问题很有趣:-)

相关问题 更多 >