0

number の平均位置の計算を含む defaultdict があります ( Euler problem )

[('1', 0.6923076923076923), ('0', 2.0), ('3', 0.2222222222222222),
 ('2', 1.0909090909090908), ('7', 0.0), ('6', 0.875), 
('9', 1.6923076923076923),('8', 1.3333333333333333)]

この情報を0から2まで手動で行うのではなく、単純な文字列に取得しようとしています。私が探している最終結果は次のようなものです

73162890

多くの if-else および for-loop を使用せずにそれらを抽出する良い方法がわかりません。

Pythonでこれを行う簡単で良い方法はありますか?

4

2 に答える 2

8

あなたの口述がdである場合、items = d.items()あなたが持っているように、あなたにペアのリストを与えます。このリストを取得したら、2番目の要素で並べ替えることができます。

ordered = sorted(items, key=lambda (_, value): value) # Not Python 3

# or,
ordered = sorted(items, key=lambda x: x[1])

# or,
import operator
ordered = sorted(items, key=operator.itemgetter(1))

ソートされた順序でリストを作成したら、それぞれから文字列を抽出し、それらをすべて接着する必要があります。

result = ''.join(string for (string, _) in ordered)

(私は未使用のパラメーターを呼び出していることに注意してください。Pythonプログラムでは_特別なことは何もありません。)_

于 2012-11-07T20:22:41.957 に答える
6
In [36]: ''.join([key for key, val in sorted(data, key = lambda item: item[1])])
Out[36]: '73162890'

説明:

これにより、の各アイテムの2番目の値に従ってデータが並べ替えられdataます。

In [37]: sorted(data, key = lambda item: item[1])
Out[37]: 
[('7', 0.0),
 ('3', 0.2222222222222222),
 ('1', 0.6923076923076923),
 ('6', 0.875),
 ('2', 1.0909090909090908),
 ('8', 1.3333333333333333),
 ('9', 1.6923076923076923),
 ('0', 2.0)]

これで、リスト内包表記を使用して各アイテムの最初の値を収集できます。

In [38]: [key for key, val in sorted(data, key = lambda item: item[1])]
Out[38]: ['7', '3', '1', '6', '2', '8', '9', '0']

そして、これらのアイテムを以下を使用''.joinして文字列に結合します。

In [39]: ''.join([key for key, val in sorted(data, key = lambda item: item[1])])
Out[39]: '73162890'
于 2012-11-07T20:22:39.957 に答える