私の質問は 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()
ロード時に直接行う方法はありますか?
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)}
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
部分を削除できます。
このソリューションは、提供した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
これにより、上記と同じ出力が生成されます。