重新排列列表中的元素

时间:2017-11-30 22:52:04

标签: python python-3.x

我有一个包含一些项目的列表。我想重新排列它们如下:

  • product_name应该是第一个元素
  • items image 开头应该是最后一个(也应该排序)
  • 其余的项目应该介于两者之间,没有特别的顺序。

杂项:我的列表中只有一个(并且总是一个)product_name,里面的项目没有特定的顺序排列(也就是说,项目的顺序是随机的 - 我刚才举了一个例子)。此外,该列表包含唯一的items

以下是它的工作,但似乎有点冗长和低效。我确信有一种方法可以在单个for循环中执行此操作,但我现在有一个脑筋。是否有更简单的方法来实现以下目标?

def rearrange(header):
    final = ['product_name']
    images = sorted([item for item in header if item.startswith('image')])

    for item in header:
        if item != 'product_name' and not item.startswith('image'):
            final.append(item)

    final += images
    return final


header = [
    'word2',
    'image_4',
    'word1',
    'product_name',
    'image_3',
    'image_1',
    'image_5',
    'word3',
    'image_6',
    'image_2',
]

print(rearrange(header))

结果:

['product_name', 'word2', 'word1', 'word3', 'image_1', 'image_2', 'image_3', 'image_4', 'image_5', 'image_6']

3 个答案:

答案 0 :(得分:5)

您可以使用key内置的sorted关键字:

 sorted(header, key=lambda x: (x.startswith('image') + (x != 'product_name'), x))

结果:

['product_name', 'word1', 'word2', 'word3', 'image_1', 'image_2', 'image_3', 'image_4', 'image_5', 'image_6']

答案 1 :(得分:1)

你可以试试这个:

header = [
'word2',
'image_4',
'word1',
'product_name',
'image_3',
'image_1',
'image_5',
'word3',
'image_6',
'image_2',
]
final_results = ['product_name']+[i for i in header if i != 'product_name' and not i.startswith('image')]+sorted([i for i in header if i.startswith('image')])

输出:

['product_name', 'word2', 'word1', 'word3', 'image_1', 'image_2', 'image_3', 'image_4', 'image_5', 'image_6']

答案 2 :(得分:0)

您可以重复使用用于构建图像列表的技术来构建非图像列表。由于您不需要它,因此将其关闭,但请记住也要排除product_name。然后用+ =将它们粘在一起就像你一样。不需要'for'循环。

def rearrange(header):
    final = ['product_name']
    images = sorted([item for item in header if item.startswith('image')])
    non_images = [item for item in header if not item.startswith('image') and item !='product_name']

    retval = final
    retval += non_images
    retval += images
    return retval