2016-03-25 5 views
1

Ich mag eine Liste sortieren würde sortieren oder ein Array mit Python folgendes achive: Sagen meine erste Liste ist:Wie Python-Listen aufgrund bestimmter Kriterien

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

ich alle erhalten möchten Elemente, die 1 hinter dem ersten Unterstrich zusammen in einer Liste enthalten und solche, die 2 zusammen in einer Liste enthalten und so weiter. So sollte das Ergebnis sein:

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

Mein Code:

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) 

funktioniert, aber es ist wirklich peinlich, und es sind viele für Schleifen, die alles verlangsamen, wenn die Listen groß sind.

Gibt es einen eleganteren Weg mit numpy oder irgendetwas?

Hilfe ist willkommen. Vielen Dank.

Antwort

2

Ich bin mir nicht sicher, wie viel eleganter diese Lösung ist; es ist ein bisschen effizienter. Sie können zunächst die Liste sortieren und dann durchlaufen und in der endgültige Satz von sortierten Listen filtern:

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 

Wenn Sie Annahmen über die Werte nach dem ersten Unterstrich machen können, können Sie es bis etwas (zum Beispiel reinigen könnten , wenn du wüsstest, dass sie immer fortlaufende Nummern sind, beginnend bei 1).

Verwandte Themen