2

Halo、dictのリストを値でソートしたい:

a = [{'cavity' : '11A', 'ltg_nr' : 'Ltgnr11A'},
        {'cavity' : '20', 'ltg_nr' : 'Ltgnr20'},
        {'cavity' : '10', 'ltg_nr' : 'Ltgnr10'},
        {'cavity' : '17B', 'ltg_nr' : 'Ltgnr17B'},
        {'cavity' : '1K', 'ltg_nr' : 'Ltgnr1K'},
        {'cavity' : '11A', 'ltg_nr' : 'Ltgnr11A'},
        {'cavity' : '11A', 'ltg_nr' : 'Ltgnr11A'},
        {'cavity' : '22', 'ltg_nr' : 'Ltgnr22'},
        {'cavity' : '21A', 'ltg_nr' : 'Ltgnr21A'},
        {'cavity' : '21C', 'ltg_nr' : 'Ltgnr21C'},
        {'cavity' : '21B', 'ltg_nr' : 'Ltgnr170'},
        {'cavity' : '101', 'ltg_nr' : 'Ltgnr170'},
        {'cavity' : '22AA', 'ltg_nr' : 'Ltgnr170'},
        {'cavity' : '100A', 'ltg_nr' : 'Ltgnr170'}]
newList= sorted(a, key=lambda k: (len(k['cavity']),k['cavity']) )
print "-"*20 + ' sorted ' + "-"*20
for k in newList:
    print k['cavity']

結果は私が除外したものではありません:

C:\Python27>python.exe test_dict.py
-------------------- sorted --------------------
10
1K
20
22
101
11A
11A
11A
17B
21A
21B
21C
100A
22AA

最初に数字で並べ替え、次に英字で並べ替えます。どうやってやるの :

1K
10
11A
11A
11A
17B
20
21A
21B
21C
22
22AA
100A
101

すべての推測は大歓迎です:)ThanxPiotr

4

2 に答える 2

3

natural_key() 関数の使用:

import re

def natural_key(astr):
    """See http://www.codinghorror.com/blog/archives/001018.html"""
    return [int(s) if re.match(r'\d+$', s) else s
            for s in re.split(r'(\d+)', astr)]

sorted_list = sorted(a, key=lambda d: natural_key(d['cavity']))

結果

[{'cavity': '1K', 'ltg_nr': 'Ltgnr1K'},
 {'cavity': '10', 'ltg_nr': 'Ltgnr10'},
 {'cavity': '11A', 'ltg_nr': 'Ltgnr11A'},
 {'cavity': '11A', 'ltg_nr': 'Ltgnr11A'},
 {'cavity': '11A', 'ltg_nr': 'Ltgnr11A'},
 {'cavity': '17B', 'ltg_nr': 'Ltgnr17B'},
 {'cavity': '20', 'ltg_nr': 'Ltgnr20'},
 {'cavity': '21A', 'ltg_nr': 'Ltgnr21A'},
 {'cavity': '21B', 'ltg_nr': 'Ltgnr170'},
 {'cavity': '21C', 'ltg_nr': 'Ltgnr21C'},
 {'cavity': '22', 'ltg_nr': 'Ltgnr22'},
 {'cavity': '22AA', 'ltg_nr': 'Ltgnr170'},
 {'cavity': '100A', 'ltg_nr': 'Ltgnr170'},
 {'cavity': '101', 'ltg_nr': 'Ltgnr170'}]
于 2012-10-13T19:51:01.350 に答える
1

あなたは正しい方向に進んでいますが、主キーはおそらくそうではないはずlen(k['cavity'])です。文字列の長さのみが考慮されます。

数値コンポーネントを抽出し、具体的には数値で並べ替える必要があると思います。

import re

sorted(a, key=lambda k: (int(re.sub(r'[A-Z]+$', '', k['cavity'])), k['cavity']) )

[{'cavity': '1K', 'ltg_nr': 'Ltgnr1K'},
 {'cavity': '10', 'ltg_nr': 'Ltgnr10'},
 {'cavity': '11A', 'ltg_nr': 'Ltgnr11A'},
 {'cavity': '11A', 'ltg_nr': 'Ltgnr11A'},
 {'cavity': '11A', 'ltg_nr': 'Ltgnr11A'},
 {'cavity': '17B', 'ltg_nr': 'Ltgnr17B'},
 {'cavity': '20', 'ltg_nr': 'Ltgnr20'},
 {'cavity': '21A', 'ltg_nr': 'Ltgnr21A'},
 {'cavity': '21B', 'ltg_nr': 'Ltgnr170'},
 {'cavity': '21C', 'ltg_nr': 'Ltgnr21C'},
 {'cavity': '22', 'ltg_nr': 'Ltgnr22'},
 {'cavity': '22AA', 'ltg_nr': 'Ltgnr170'},
 {'cavity': '100A', 'ltg_nr': 'Ltgnr170'},
 {'cavity': '101', 'ltg_nr': 'Ltgnr170'}]

私が使用している正規表現は少し具体的です。大文字のAZ文字をそれぞれの末尾から削除できることを期待していますcavity。私はそれをあなたのデータセットに基づいています。そうでない場合は変更する必要があるかもしれcavityません<numbers><optional letters>

于 2012-10-13T19:34:36.400 に答える