0

次のような Python 辞書があります。

Mydict = {'a': {'y': 1, 'x': 5}, 'b': {'y': 10, 'x': 8}}

キー「x」に対応する値にアクセスする簡単な方法はありますか?この場合、第 1 レベルのキーに関係なく、第 2 レベルのキーです。

次のような for ループを使用して実行できることはわかっています。

mylist=[]
for k in Mydict.keys():
    mylist.append(Mydict[k]['x'])

しかし、そのための簡単な1行の方法はありますか?

4

4 に答える 4

6

リスト内包表記の使用:

mylist = [v['x'] for v in Mydict.values()]

外側のキーは必要ないので、内側の辞書を繰り返し処理して、目的の'x'値を取得します。

注:これは、各内部dictに'x'キーがある場合にのみ機能します。確かに、エラーを最小限に抑えるために、これを行うことができます:

mylist = [v.get('x', None) for v in Mydict.values()]

'x'これは同じように機能しますが、ディクショナリにキーがない場合のみ、例外Noneの代わりに戻ります。KeyError

タイミングについて、またどの方法が最適かを確認するには、Thorsten Kranzによる回答を参照してください。

于 2013-02-05T09:02:48.057 に答える
2

完全を期すために:map通常、リスト内包表記の良い代替手段です。

mylist = map(lambda v: v['x'], Mydict.values())

また

mylist = map(lambda k: Mydict[k]['x'], Mydict)

通常、どちらを好むかはあなた次第です。

編集:

パフォーマンスが向上したため、1,000,000 回の繰り返しの簡単な比較を以下に示します。

import timeit

Mydict = {'a': {'y': 1, 'x': 5}, 'b': {'y': 10, 'x': 8}}

def list_append(d):
    mylist=[]
    for k in d.keys():
        mylist.append(d[k]['x'])

def list_comprehension_values(d):
    return [v['x'] for v in d.values()]

def list_comprehension_keys(d):
    return [d[k]['x'] for k in d]

def map_values(d):
    return map(lambda v: v['x'], d.values())

def map_keys(d):    
    return map(lambda k: d[k]['x'], d)

for method_name in ["list_append",
                    "list_comprehension_values",
                    "list_comprehension_keys",
                    "map_values",
                    "map_keys"]:
    t = timeit.timeit(method_name + "(Mydict)",
                      "from __main__ import Mydict, " + method_name, 
                      number=1000000)
    print "%s: %.2f seconds" % (method_name, t)

結果:

list_append: 0.95 seconds
list_comprehension_values: 0.56 seconds
list_comprehension_keys: 0.47 seconds
map_values: 1.02 seconds
map_keys: 1.01 seconds

*編集 2 *

より大きな辞書の場合

Mydict = dict(zip(range(10000), 
              [{'x' : random.randint(0,10), 'y' : random.randint(0,10)} 
                  for i in range(10000)]))

繰り返しが少ない (number=10000) 場合、値は異なります。

list_append: 16.41 seconds
list_comprehension_values: 6.00 seconds
list_comprehension_keys: 9.62 seconds
map_values: 15.23 seconds
map_keys: 18.42 seconds

したがって、ここではキールックアップを節約することをお勧めします。

于 2013-02-05T09:08:06.193 に答える
0

リスト内包表記は 1 行で済み、ほぼ 2 倍高速です。

mylist = [mydict[k]['x'] for k in mydict]
于 2013-02-05T09:00:47.250 に答える
0

リスト内包表記を使用する

mylist = [Mydict[k]['x'] for k in Mydict]

Mydict反復処理は自動的にキーを反復処理するため、反復処理は不要であることに注意してくださいMydict.keys()

于 2013-02-05T09:01:11.273 に答える