0

我有一些输入数据格式,它就像一棵树。并包含列表列表的列表。输入就像

in_put = [[['shop_id', '=', 1]],
           [['shop_id', '=', 1],['product_id', '=', 16]],
           [['shop_id', '=', 1],['product_id', '=', 8]],
           [['shop_id', '=', 1],['product_id', '=', 4]],
           [['shop_id', '=', 1],['product_id', '=', 6]],
           [['shop_id', '=', 1],['product_id', '=', 16],['so', '=', 1]],
           [['shop_id', '=', 1],['product_id', '=', 8],['so', '=', 1]],
           [['shop_id', '=', 1],['product_id', '=', 4],['so', '=', 1]],
           [['shop_id', '=', 1],['product_id', '=', 6],['so', '=', 1]],
           [['shop_id', '=', 1],['product_id', '=', 16],['so', '=', 2]],
           [['shop_id', '=', 1],['product_id', '=', 8],['so', '=', 2]],
           [['shop_id', '=', 1],['product_id', '=', 4],['so', '=', 2]],
           [['shop_id', '=', 1],['product_id', '=', 6],['so', '=', 2]],
           [['shop_id', '=', 1],['product_id', '=', 16],['so', '=', 1],['state', '=', u'draft']],
           [['shop_id', '=', 1],['product_id', '=', 8],['so', '=', 1],['state', '=', u'draft']],
           [['shop_id', '=', 1],['product_id', '=', 4],['so', '=', 1],['state', '=', u'draft']],
           [['shop_id', '=', 1],['product_id', '=', 6],['so', '=', 1],['state', '=', u'draft']],
           [['shop_id', '=', 1],['product_id', '=', 16],['so', '=', 2],['state', '=', u'draft']],
           [['shop_id', '=', 1],['product_id', '=', 8],['so', '=', 2],['state', '=', u'draft']],
           [['shop_id', '=', 1],['product_id', '=', 4],['so', '=', 2],['state', '=', u'draft']],
           [['shop_id', '=', 1],['product_id', '=', 6],['so', '=', 2],['state', '=', u'draft']],
           ]

我想以以下格式排列数据。

output = [   
    [['shop_id', '=', 1]],
    [['shop_id', '=', 1],['product_id', '=', 16]],
    [['shop_id', '=', 1],['product_id', '=', 16],['so', '=', 1]],
    [['shop_id', '=', 1],['product_id', '=', 16],['so', '=', 2]],
    [['shop_id', '=', 1],['product_id', '=', 16],['so', '=', 1],['state', '=', u'draft']],
    [['shop_id', '=', 1],['product_id', '=', 16],['so', '=', 2],['state', '=', u'draft']],
    [['shop_id', '=', 1],['product_id', '=', 8]],
    [['shop_id', '=', 1],['product_id', '=', 8],['so', '=', 1]],
    [['shop_id', '=', 1],['product_id', '=', 8],['so', '=', 2]],
    [['shop_id', '=', 1],['product_id', '=', 8],['so', '=', 1],['state', '=', u'draft']],
    [['shop_id', '=', 1],['product_id', '=', 8],['so', '=', 2],['state', '=', u'draft']],
    [['shop_id', '=', 1],['product_id', '=', 4]],
    [['shop_id', '=', 1],['product_id', '=', 4],['so', '=', 1]],
    [['shop_id', '=', 1],['product_id', '=', 4],['so', '=', 2]],
    [['shop_id', '=', 1],['product_id', '=', 4],['so', '=', 1],['state', '=', u'draft']],
    [['shop_id', '=', 1],['product_id', '=', 4],['so', '=', 2],['state', '=', u'draft']],
    [['shop_id', '=', 1],['product_id', '=', 6]],
    [['shop_id', '=', 1],['product_id', '=', 6],['so', '=', 1]],
    [['shop_id', '=', 1],['product_id', '=', 6],['so', '=', 2]],
    [['shop_id', '=', 1],['product_id', '=', 6],['so', '=', 1],['state', '=', u'draft']],
    [['shop_id', '=', 1],['product_id', '=', 6],['so', '=', 2],['state', '=', u'draft']],
]

我如何实现这样的数据排列。python中有没有可用的短方法,

4

2 回答 2

4

你应该使用sorted

sorted(in_put, key=lambda x: (
                    x[0][2],
                    {16:1,8:2,4:3,6:4}[x[1][2]] if len(x)>1 else None,
                    x[3][2] if len(x)>3 else None,
                    x[2][2] if len(x)>2 else None
                    ))

如果 product_id 需要排序为 16/8/6/4 (而不是在您的示例中的顺序),那么您可以使用

sorted(in_put, key=lambda x: (
                    x[0][2],
                    1.0/x[1][2] if len(x)>1 else None,
                    x[3][2] if len(x)>3 else None,
                    x[2][2] if len(x)>2 else None
                    ))
于 2013-02-14T07:25:21.363 回答
1

一般来说,我会sorted用来获取根据某些标准排序的列表副本。

在您的特定情况下,它不会立即适用。相反,我们可以这样做:

output = [in_put[0]] + in_put[1::4] + in_put[2::4] + in_put[3::4] + in_put[4::4]

根据需要重新排列列表。(更短一点,您可以使用zip)。

于 2013-02-14T06:37:27.323 回答