2016-12-29 9 views
2

私はPython 3.5を使用しています。私はエントリを持つ辞書を持っている:Pythonで複数の小数点と文字列を持つ辞書のキーを並べ替える

myresult = { '6.1.2 & 6.3.2, abcd' : xyz, 
      '6.10.2 & 6.12.2, hjsd' : xyz, abc, ssd 
      '6.2.2 & 6.4.2, abcd' : asd, 
      '6.9.2 & 6.11.2, qwer' : tzu, 
      '6.21.2 & 6.23.2, xzty' : asd } 

の予想される出力は

>>>'6.1.2 & 6.3.2, abcd' : xyz 
    '6.2.2 & 6.4.2, abcd' : asd 
    '6.9.2 & 6.11.2, qwer' : tzu, 
    '6.10.2 & 6.12.2, hjsd' : xyz, abc, ssd 
    '6.21.2 & 6.23.2, xzty' : asds 

である、すなわち、私は数字が通常の整数として、小数点の後にソートする必要があります。

私は出力が

'6.1.2 & 6.3.2, abcd' : xyz 
'6.10.2 & 6.12.2, hjsd' : xyz, abc, ssd 
'6.2.2 & 6.4.2, abcd' : asd 
'6.21.2 & 6.23.2, xzty' : asds 
'6.9.2 & 6.11.2, qwer' : tzu 

たすべてのヘルプは非常に高く評価されるだろうに。for key in sorted(myresult.keys()): print(key)

を使用してみました

はそれを達成するための簡単な方法はsortedにキー機能を提供することであるあなた

答えて

2

ありがとう:

def num_keyfn(something): 
    parts = something.split(".") 
    return tuple(int(x) if x.isnumeric() else x for x in parts) 

for key in sorted(myresult.keys(), key=num_keyfn): 
    print(key) 

これは、出力します。

6.1.2 & 6.3.2, abcd 
6.2.2 & 6.4.2, abcd 
6.9.2 & 6.11.2, qwer 
6.10.2 & 6.12.2, hjsd 
6.21.2 & 6.23.2, xzty 

これはまだ完璧ではない、それとしてその違いがどこかの中間にある場合は動作しませんが、原則を見て自分のニーズに適応させることができます。


sorted(又は.sort)は代わりに、直接の要素を比較し、それが最初の要素にこの関数を呼び出す、key機能が与えられます。たとえば、文字列を長さでソートするには、引数key=lenを指定します。

Pythonはタプルを比較できます:(2,4)(2,5)より小さいです。

私の答えでは、すべてのドットの文字列を部分に分割し、intにキャストした部分はすべて.isnumeric()です。 "10""2"より小さいが、102より小さくない。

+0

残念なことに、 'sorted(myresult.keys()) 'と同じ出力を生成します。 – Seetharama

+1

@Seetharama私は数秒前にそれを変更しました。最新バージョンで試しましたか? – L3viathan

+0

魅力的な作品!あなたは少し説明してくれませんか? :-) – Seetharama

関連する問題