在python中排列列表

时间:2013-02-14 06:34:02

标签: python list

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

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中有任何简短的方法,

2 个答案:

答案 0 :(得分: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
                    ))

答案 1 :(得分:1)

一般情况下,我会使用sorted来获取根据某些条件排序的列表副本。

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

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

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