2016-09-02 14 views
0

私はPythonでリストをソートしようとしていますが、同じタームに文字と数字の両方が含まれています。それは正確に数字を並べ替えていないということである文字列でソートを使用しての問題点:Pythonの数字と文字の組み合わせリストの並べ替え

2 
23 
3 

など

list = [("a", ['8', '0']), ("a", ['7', '0b']), ("a", ['7', '0']), ("a", ['6', '0b']), ("a", ['6', '01']] 

new_list = sorted(list, key=lambda i: i[1]) 
# works great on ints. 

文字が同数、すなわちとしてソートする必要があります

したがって
a = 1, b = 2, c = 3, d = 4 etc 

4.1a == 4.11

しかし、私はトンを必要としますo出力に文字を保存し、intに変換するだけではありません。何か案は?ここで

+2

を示してきている。

私は、これは何が必要であるかどうかわからないんだけど? – thefourtheye

+0

'i [1]'を文字列に変換し、 'a'を' 1'、 'b'を' 2'などに置き換えてfloatに変換した文字列を返し、キー? – nekomatic

+0

上記は完璧に聞こえます。それをやり遂げる方法を試してみよう(私は先進的なPythonには新しくなった)。 –

答えて

0

は私のソリューションです:

def f(s): 
    m = {'a': 1,'b': 2,'c': 3,'d': 4,'e': 5, 
     'f': 6,'g': 7,'h': 8,'i': 9,'j': 10, 
     'k': 11,'l': 12,'m': 13,'n': 14,'o': 15, 
     'p': 16,'q': 17,'r': 18,'s': 19, 
     't': 20,'u': 21,'v': 22,'w': 23, 
     'x': 24,'y': 25,'z': 26} 
    result = [] 
    for l in s: 
     try: 
      result.append(int(l)) 
     except ValueError: 
      result.append(m[l]) 
    return result 

list = [("a", ['8', '0']), ("a", ['7', '0b']), ("a", ['7', '0']), ("a", ['6', '0b']), ("a", ['6', '01'])] 
new_list = sorted(list, key=lambda i: f(''.join(i[1]))) 

>>> new_list 
[('a', ['6', '01']), 
('a', ['6', '0b']), 
('a', ['7', '0']), 
('a', ['7', '0b']), 
('a', ['8', '0'])] 

機能は、[6,0,2](文字はマッピング辞書以下の整数に変換されているに「60B」のようなものを変換に基づいて、次にラムダ種類。リストを返された。

+0

OPは[['7'、 '0'] 'が' ['6'、 '01'] 'の前にソートされた順番で表示されると思っています。 –

+0

@ PM2Ring私はそう思わない、 '['7'、 '0']'はバージョン6.01以降のバージョン7.0を意味するはずです。あなたが正しいのであれば、ラムダ式で 'f(' 'join(i [1])) 'を' f(i [1] [1]) 'に変更すれば十分です。 –

0

それはあなたの質問とは全く明らかではないが、私はあなたが各タプルの最初の項目を無視し、そして唯一の2番目の項目にリストにソートされていることを前提としています。私はまた、 "からそののみ手紙を想定しますa '〜' i 'はそのリストに現れます。

- > 1、b - > 2、c - > 3、... i - > 9に変換する簡単な方法は、数字のASCIIコードが連続していることを利用することです。小文字。したがって、各文字とそれに相当する数字の間に48の一定のオフセットがあります。

文字列のリストをキーに変換するには、すべての文字列を単一の文字列に結合し、文字列の各文字charを対応する数字charに変換し、結果の文字を1つの文字列に戻します。その文字列を整数に変換します。その影として

lst = [ 
    ("a", ['8', '0']), 
    ("a", ['7', '0b']), 
    ("a", ['7', '0']), 
    ("a", ['6', '0b']), 
    ("a", ['6', '01']), 
] 

def keyfunc(t): 
    a = [chr(ord(c) - 48) if 'a' <= c <= 'i' else c for c in ''.join(t[1])] 
    return int(''.join(a)) 

new_lst = sorted(lst, key=keyfunc) 
for row in new_lst: 
    print(row) 

出力

('a', ['7', '0']) 
('a', ['8', '0']) 
('a', ['6', '01']) 
('a', ['6', '0b']) 
('a', ['7', '0b']) 

ところで、あなたは、変数名としてlistを使用してはならないlistタイプを内蔵しており、それは神秘的なバグにつながることができます。

0

増分ソートを行っていますか、a1要素でソートするだけですか?あなたが本当に文字の番号値を取得する必要がある場合は

、あなたはおそらく string.ascii_letters.index(letter) それとも、文字だけのための連続した数字が必要な場合は、より良い、< = B、 使用ord(letter)を使用することができます。

しかし、文字は整数値を取得する必要なく適切にソートする必要があります。私は問題が['a', 'a1']を分けていると思う。入力のために期待される結果は、あなたは何を

def sort_func(item): 
    try: 
     return item[1][1][1] 
    except: 
     return item[1][1] 

# sort by the alphanumeric 
vals.sort(key=sort_func) 
# sort again by the number 
vals.sort(key=lambda i: int(i[1][0])) 
# sort again by the first letter 
vals.sort(key=lambda i:i[0]) 
関連する問題