2017-04-26 1 views
0

ich eine Liste im Format habe:Sortieren einer Liste einen bestimmten Abschnitt in der Liste Python nach

Apple, Orange[123 431]43351 
Banana, Cherry[141 421]23423 
Coconut, Mango[23 12312]232342 
.... 
.... 

Ich mag die Liste sortiert nach der Zahl nach der Klammer ‚]‘. Die Ausgabe sollte sein:

Banana, Cherry[141 421]23423 
Apple, Orange[123 431]43351 
Coconut, Mango[23 12312]232342 

Ich versuche, um die Liste zu sortieren, dies durch den Einsatz:

LIST.sort(key = lambda x: x.split()[1]) 
for item in LIST: 
    print(item) 

ich die letzte Nummer von diesen finden: Aber ich bin nicht in der Lage, es zu sortieren

for item in LIST: 
    bracket_index = item.find("]") 
    end_of_line = item[bracket_index + 1:] 
    if bracket_index != -1: 
     print(end_of_line) 
+1

'LIST.sort (Schlüssel = Lambda x: int (x.split (') ') [1]))'? – Psidom

+0

Nur eine Anmerkung, ALL_CAPS wird normalerweise für Konstanten verwendet, dh Variablen, die sich nicht ändern. Wenn Sie die Liste sortieren, fällt sie wahrscheinlich nicht unter diese Kategorie. – zondo

Antwort

1

Wie ist das Format Ihrer Liste? Ist es eine Liste von Tupeln oder eine Liste von Strings? Dies funktioniert:

a = ['Apple, Orange[123 431]43351', 
'Banana, Cherry[141 421]23423', 
'Coconut, Mango[23 12312]232342'] 

a.sort(key = lambda el: el.split(']')[1]) 
print(a) 

Output: 
['Coconut, Mango[23 12312]232342', 
'Banana, Cherry[141 421]23423', 
'Apple, Orange[123 431]43351'] 

Wenn es sich um eine Liste von Paaren von Strings statt, dann sollten Sie key = lambda el: el[1].split(']')[1] wie so verwenden:

a = [('Apple', 'Orange[123 431]43351'), 
('Banana', 'Cherry[141 421]23423'), 
('Coconut',' Mango[23 12312]232342')] 

a.sort(key = lambda el: el[1].split(']')[1]) 
print(a) 

Output: 
[('Coconut', ' Mango[23 12312]232342'), 
('Banana', 'Cherry[141 421]23423'), 
('Apple', 'Orange[123 431]43351')] 
+0

meine Liste ist im Format: list = [ 'Apfel, Orange [123 431] 43351', 'Banane, Kirsche [141 421] 23423', 'Kokosnuss, Mango [23 12312] 232342'] I will die Ausgabe sein: Banane, Kirsche [141 421] 23423 Apfel, Orange [123 431] 43351 Kokosnuss, Mango [23 12312] 232342 –

+0

@VaibhavBorkar Nun, das ist genau das Format, das ich in meiner ersten Antwort angesprochen habe. – asdf

0

Sie mit @ Psidom Vorschlag gehen kann:

LIST.sort(key=lambda x: int(x.split(']')[1])) 

Beachten Sie die Verwendung von int(), um sicherzustellen, dass die Sortierung erfolgt numerisch statt durch String-Vergleiche (die sind träge durchgeführt, dh '4321' gilt als "größer" als '20000000' aufgrund '4' > '2').


Voll Beispiel:

LIST = [ 
    'Apple, Orange[123 431]43351', 
    'Banana, Cherry[141 421]23423', 
    'Coconut, Mango[23 12312]232342' 
] 

LIST.sort(key=lambda x: int(x.split(']')[1])) 
print(LIST) 

Eine bessere Methode wäre die Saiten zuerst zu analysieren. Zum Beispiel:

from collections import namedtuple 
import re 

FruitTuple = namedtuple('FruitTuple', ['fruit', 'color', 'num1', 'num2', 'num3']) 

unparsed_list = [ 
    'Apple, Orange[123 431]43351', 
    'Banana, Cherry[141 421]23423', 
    'Coconut, Mango[23 12312]232342' 
] 

split_list = [re.search('(\\w+), (\\w+)\\[(\\d+) (\\d+)\\](\\d+)', x).groups() for x in unparsed_list] 
fruit_list = [FruitTuple(*x) for x in split_list] 
fruit_list.sort(key=lambda x: int(x.num2)) 

print(fruit_list) 

Erzeugt:

[FruitTuple (Früchte = 'Banana', color = 'Cherry', '141' num1 =, num2 = '421', num3 = '23423'), FruitTuple (Frucht = 'Apfel', Farbe = 'Orange', num1 = '123', num2 = '431', num3 = '43351'), FruitTuple (Frucht = 'Kokosnuss', color = 'Mango', num1 = '23 ', num2 =' 12312 ', num3 =' 232342 ']]

+0

Es stimmt nicht genau, dass Zeichenfolgenvergleiche nur die ersten Zeichen berücksichtigen. Das hängt davon ab, wie ähnlich die Strings sind.Beim Vergleich von "This" mit "Thin" würden alle Zeichen verglichen. – zondo

+0

Ich erhalte einen Syntaxfehler für die Anweisung (Schlüssel = Lambda x:) –

+0

Sorry, ich vergaß das '']'' –

Verwandte Themen