我有一个包含一些项目的列表。我想重新排列它们如下:
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']
答案 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