2016-08-17 11 views
0

私はPython 3を使用していますが、リストにキャストしているにもかかわらず、'dict_keys'オブジェクトを取得するとリストにキャストされてもインデックス作成はサポートされません

これは、関数の呼び出しです:

path = euleriancycle(edges) 

そして、私はキー方式を使用しているところ、これは次のとおりです。私はリストするタイプキャストせずにそれを実行しようとしたと、このエラーを得た

def euleriancycle(e): 
    currentnode = list[e.keys()[0]] 
    path = [currentnode] 

を。このサイトと同様のクエリについて噂を振りまいた後、私は提案されたソリューションとリストにタイプキャストしたが役に立たなかった。私は同じエラーがあります。

これはエラートラックである:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-56-356b905111a9> in <module>() 
    45    edges[int(edge[0])] = [int(edge[1])] 
    46 
---> 47 path = euleriancycle(edges) 
    48 print(path) 

<ipython-input-56-356b905111a9> in euleriancycle(e) 
     1 def euleriancycle(e): 
----> 2  currentnode = list[e.keys()[0]] 
     3  path = [currentnode] 
     4 
     5  while true: 

TypeError: 'dict_keys' object does not support indexing 
+1

'リスト(e.keys())[0]'作品が、 '次の(ITER(E))'、おそらくあなたは* *に 'e.keysを()'キャストなかった – vaultah

+3

優れています索引付けの前にリストします。あなたは 'e.keys()[0]'の* result *をリストにキャストしようとしました(ただし、索引構文が壊れていても 'list [...]'ではなく 'list(...)')。おそらく 'list(e.keys())[0]'(括弧に注意してください!)を使うことを意図していましたが、これは 'list(e)[0]'の綴りの冗長な方法です。 –

答えて

6

dict_keysオブジェクトが、集合のように、索引付けすることができません。

の代わりにこの:

list(e)[0] 

Pythonが返される辞書からどのキーには何の保証を行いませんので、あなたが入れたいかもしれません:

list[e.keys()[0]] 

次の最も近いものはこのことだろうそれを自分で注文する。

+0

キーの順序が重要な場合は、 'collections.OrderedDict'を使用してください。 –

2

あなたはリスト(脇list(...)list[...]の構文エラー)にその要素を変換、インデックスにdict_keysオブジェクト、をしようとしています。オブジェクト全体を最初にリストに変換する必要があります。を次ににインデックスする必要があります。

currentnode = list[e.keys()[0]] # Wrong 
currentnode = list(e.keys()[0]) # Less wrong, but still wrong 
currentnode = list(e.keys())[0] # Right 

list任意のイテラブルを取り、辞書によって返される反復子は、そのキーの上にちょうどイテレータなので、明示的keysを呼び出す必要はありません。

currentnode = list(e)[0] 
関連する問題