web-dev-qa-db-ja.com

辞書で文字列キーをintに変換します

私の質問は this one と非常に似ていますが、リストの辞書があり、キー値とすべてのリスト形式のすべての要素の両方をstringからint

たとえば、辞書が欲しいです:

{ '1':['1', '2', '3', '4'] , '2':['1', '4'] , '3':['43','176'] }

になる:

{ 1:[1, 2, 3, 4] , 2:[1, 4] , 3:[43,176] }

これは可能ですか?

JSON形式のファイルからこの辞書を作成して以来、より一般的に

{"0":["1"、 "2"、 "3"、 "4"]、 "1":["0"、 "2"、 "3"、 "4"、 "27"、 "94 「、「95」、「97」、「128」、「217」、「218」、「317」]、「2」:[「0」、「1」、「3」、「4」、「94 "、" 95 "]、" 3 ":[" 0 "、" 1 "、" 2 "、" 4 "、" 377 "]、" 4 ":[" 0 "、" 1 "、" 2 "、 「3」、「27」、「28」]、「5」:[「6」、「7」、「8」]、「6」:[「5」、「7」、「8」]、「 7 ":[" 5 "、" 6 "、" 8 "、" 14 "、" 23 "、" 40 "、" 74 "、" 75 "、" 76 "、" 362 "、" 371 "、" 372 "]、" 8 ":[" 5 "、" 6 "、" 7 "、" 66 "]、" 9 ":[" 10 "、" 11 "、" 12 "]、" 10 ":[" 9 "、" 11 "、" 12 "、" 56 "、" 130 "、" 131 "]}

次の手順で:

json_data = open("coauthorshipGraph.txt")
coautorshipDictionary = json.load( json_data )
json_data.close()

ロード時に直接行う方法はありますか?

30
Matteo
d = {'1':'145' , '2':'254' , '3':'43'}
d = {int(k):int(v) for k,v in d.items()}
>>> d
{1: 145, 2: 254, 3: 43}

値のリスト用

>>> d = { '1':['1', '2', '3', '4'] , '2':['1', '4'] , '3':['43','176'] }
>>> d = {int(k):[int(i) for i in v] for k,v in d.items()}

あなたの場合:

coautorshipDictionary = {int(k):int(v) for k,v in json.load(json_data)}

または

coautorshipDictionary = {
    int(k):[int(i) for i in v] for k,v in json.load(json_data)}
47
ndpu

Decencyの答えに似ていますが、_object_hook_引数を利用しています:

_coautorshipDictionary = json.load(json_data, object_hook=lambda d: {int(k): [int(i) for i in v] if isinstance(v, list) else v for k, v in d.items()}) # iteritems() for Python 2
_

このメソッドの主な利点は、ネストされたdictになった場合、ローダーがネストされた各dictを処理するため、結果のdictをウォークスルーするコードを記述する必要なく、データをロードすることです。 JSON構造がより複雑になり、データにリストのみがトップレベルのdictの値として含まれる場合、リストの値が数値文字列ではない場合やリスト自体にdictが含まれる場合のチェックを追加することもできますif isinstance(v, list) else v部分を削除できます。

4
JAB

このソリューションは、提供したjsonのように、値として反復可能なものがある場合に機能します。

my_dict = {"0": ["1", "2", "3", "4"], "1": ["0", "2", "3", "4", "27", "94", "95", "97", "128", "217", "218", "317"], "2": ["0", "1", "3", "4", "94", "95"], "3": ["0", "1", "2", "4", "377"], "4": ["0", "1", "2", "3", "27", "28"], "5": ["6", "7", "8"], "6": ["5", "7", "8"], "7": ["5", "6", "8", "14", "23", "40", "74", "75", "76", "362", "371", "372"], "8": ["5", "6", "7", "66"], "9": ["10", "11", "12"], "10": ["9", "11", "12", "56", "130", "131"]}

output_dict = {}
for key, value in my_dict.iteritems():
    output_dict[int(key)] = [int(item) for item in value]

output_dict

出力:

{0: [1, 2, 3, 4],
 1: [0, 2, 3, 4, 27, 94, 95, 97, 128, 217, 218, 317],
 2: [0, 1, 3, 4, 94, 95],
 3: [0, 1, 2, 4, 377],
 4: [0, 1, 2, 3, 27, 28],
 5: [6, 7, 8],
 6: [5, 7, 8],
 7: [5, 6, 8, 14, 23, 40, 74, 75, 76, 362, 371, 372],
 8: [5, 6, 7, 66],
 9: [10, 11, 12],
 10: [9, 11, 12, 56, 130, 131]}

質問の2番目の部分では、ファイルを読む際に、ディクテーションの理解をインラインで使用できます。しかし、それは地獄のように難読化されています。

with open('coauthorshipGraph.txt', 'r') as f:
    json_data = { int(key) : [int(item) for item in value] for key, value in json.load(f).iteritems()}

json_data

これにより、上記と同じ出力が生成されます。

3
Chris Arena