如何根据某些条件对python列表进行排序

时间:2016-03-25 16:19:22

标签: list python-2.7 sorting numpy

我想使用python对列表或数组进行排序,以实现以下目的: 说我的初始列表是:

example_list = ["retg_1_gertg","fsvs_1_vs","vrtv_2_srtv","srtv_2_bzt","wft_3_btb","tvsrt_3_rtbbrz"]

我想在一个列表中将所有在第一个下划线后面有1个的元素和在一个列表中有2个在一起的元素依此类推。所以结果应该是:

sorted_list = [["retg_1_gertg","fsvs_1_vs"],["vrtv_2_srtv","srtv_2_bzt"],["wft_3_btb","tvsrt_3_rtbbrz"]]

我的代码:

import numpy as np
import string

example_list = ["retg_1_gertg","fsvs_1_vs","vrtv_2_srtv","srtv_2_bzt","wft_3_btb","tvsrt_3_rtbbrz"]

def sort_list(imagelist):

    # get number of wafers
    waferlist = []
    for image in imagelist:
        wafer_id = string.split(image,"_")[1]
        waferlist.append(wafer_id)
    waferlist = set(waferlist)
    waferlist = list(waferlist)
    number_of_wafers = len(waferlist)
    # create list
    sorted_list = []
    for i in range(number_of_wafers):
        sorted_list.append([])
    for i in range(number_of_wafers):
        wafer_id = waferlist[i]
        for image in imagelist:
            if string.split(image,"_")[1] == wafer_id:
                sorted_list[i].append(image)
    return sorted_list

sorted_list = sort_list(example_list)

有效,但它真的很尴尬,它涉及许多for循环,如果列表很大,会减慢所有内容。

使用numpy还是其他任何更优雅的方式?

帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:2)

我不确定这个解决方案有多优雅;它更有效率。您可以先对列表进行排序,然后浏览并过滤到最终的排序列表集:

example_list = ["retg_1_gertg","fsvs_1_vs","vrtv_2_srtv","srtv_2_bzt","wft_3_btb","tvsrt_3_rtbbrz"]

sorted_list = sorted(example_list, key=lambda x: x[x.index('_')+1])

result = [[]]
current_num = sorted_list[0][sorted_list[0].index('_')+1]
index = 0

for i in example_list:
    if current_num != i[i.index('_')+1]:
       current_num = i[i.index('_')+1]
       index += 1
       result.append([])
    result[index].append(i)

print result

如果您可以在第一个下划线字符后对值进行假设,则可以将其清理一下(例如,如果您知道它们将始终是从1开始的连续数字)。