2017-04-26 12 views
0

内の特定の部分に従ってリスト:私はブラケット後数に応じてリストをソートしたいソート私はフォーマットのリストを持って、リストのPython

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

を「]」。 出力は次のようになります。 しかし、私はそれをソートすることはできませんよ

:私はこれで最後の番号を見つけることができます

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

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

私はこれを使って、リストをソートしようとしています

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(key = lambda x:int(x.split(') ')))'? – Psidom

+0

ちょうどメモ、ALL_CAPSは通常定数に使用されます。つまり、変更されない変数です。リストをソートしている場合は、おそらくそのカテゴリに該当しません。 – zondo

答えて

1

あなたのリストの形式は何ですか?それはタプルのリストか文字列のリストですか?これは動作します:

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'] 

ではなく、文字列のペアのリストである場合、あなたはそのようkey = lambda el: el[1].split(']')[1]を使用する必要があります。

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

私のリストは形式である:= [ 'アップル、オレンジ[123 431] 43351'、 'バナナ、チェリー[141 421] 23423'、 'ココナッツ、マンゴー[23 12312] 232342'] I リスト バナナ、チェリー[141 421] 23423 アップル、オレンジ[123 431] 43351 ココナッツ、マンゴー[23 12312] 232342 –

+0

@VaibhavBorkarまあ、これはまさに私の最初の答えで取り組んだ形式です。 – asdf

0

あなたは、@のPsidomの提案で行くことができます。

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

int()を使用して、文字列の比較ではなく数値的にの並べ替えが行われることに注意してください(これは遅れて行われます。つまり'4321'は、のために'20000000'より大きいとみなされます)。


全例:

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) 

より良い方法は、まず、あなたの文字列を解析することであろう。例えば:

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) 

を生成し:

[FruitTuple(果実= 'バナナ'、色= 'チェリー'、NUM1 = '141'、NUM2 = '421'、NUM3 = '23423' FruitTuple(fruit = 'ココナッツ'、color = 'マンゴ'、num1)、FruitTuple(fruit = 'ココナッツ'、color = 'マンゴー'、num1 = '123'、num2 = '431'、num3 = '43351' = '23 '、num2 =' 12312 '、num3 =' 232342 ')]

+0

文字列の比較で最初の数文字のみが考慮されるのは間違いありません。それは文字列の類似性に依存します。'this'と' thin'を比較すると、すべての文字が比較されます。 – zondo

+0

文の構文エラーが発生しました –

+0

申し訳ありません。 '' '' 'を忘れました –

関連する問題