2016-09-30 88 views
2

我有一個看起來像這樣JSON文件如何所有列表轉換爲集:當JSON文件加載

{ 
    "K1": { 
     "p": [ 
      "A" 
     ], 
     "s": [ 
      "B", 
      "C" 
     ] 
    }, 
    "K2": { 
     "p": [ 
      "A", 
      "F" 
     ], 
     "s": [ 
      "G", 
      "H", 
      "J" 
     ] 
    } 
} 

我可以在這個數據很容易讀:

import json 

with open('json_lists_to_sets.json') as fi: 
    data = json.load(fi) 

然後data看起來如下:

{u'K2': {u'p': [u'A', u'F'], u's': [u'G', u'H', u'J']}, u'K1': {u'p': [u'A'], u's': [u'B', u'C']}} 

但是,對於我的進一步分析,最好是使用sets而不是lists。當然,我可以轉換listssets我已經在數據讀取之後:

for vi in data.values(): 
    vi['p'] = set(vi['p']) 
    vi['s'] = set(vi['s']) 

這給了我想要的輸出:

print data['K2'] 

產量

{u'p': {u'A', u'F'}, u's': {u'G', u'H', u'J'}} 

我的問題是,是否我當我讀入json.load命令中的數據時,可以直接將這些lists轉換爲sets,所以有些像「將所有列表轉換爲設置」。有這樣的事情存在嗎?

回答

5

雖然json庫提供了許多掛鉤來改變解碼,沒有掛鉤來加載JSON數組。

你必須遞歸更新解碼後的結果,而不是事後:

def to_sets(o): 
    if isinstance(o, list): 
     return {to_sets(v) for v in o} 
    elif isinstance(o, dict): 
     return {k: to_sets(v) for k, v in o.items()} 
    return o 

此處理列表的方式在任何嵌套字典深度:

>>> to_sets(data) 
{u'K2': {u'p': set([u'A', u'F']), u's': set([u'H', u'J', u'G'])}, u'K1': {u'p': set([u'A']), u's': set([u'C', u'B'])}} 

考慮到然而,含有其他字典名單不能被處理,因爲字典不可排除。

如果你希望找到嵌套其他列表中列出,你必須切換到使用frozenset()而非set()能夠巢那些:

def to_sets(o): 
    if isinstance(o, list): 
     return frozenset(to_sets(v) for v in o) 
    elif isinstance(o, dict): 
     return {k: to_sets(v) for k, v in o.items()} 
    return o 
+0

工作正常,upvoted。不會有任何嵌套列表,但感謝提到'frozenset'部分;以前沒有聽說過這個。 – Cleb

2

下面是一個內襯表達實現這種使用dict comprehension:你想讓它使用loop實現

>>> {key: {k: set(v) for k, v in nested_dict.items()} for key, nested_dict in data.items()} 
{'K2': {'s': {'H', 'G', 'J'}, 'p': {'A', 'F'}}, 'K1': {'s': {'B', 'C'}, 'p': {'A'}}} 

然而,在情況下,下面是例子:

data = {u'K2': {u'p': [u'A', u'F'], u's': [u'G', u'H', u'J']}, u'K1': {u'p': [u'A'], u's': [u'B', u'C']}} 
for key, nested_dict in data.items(): 
    data[key] = {k: set(v) for k, v in nested_dict.items()} 

# Value of 'data': {'K2': {'s': {'H', 'G', 'J'}, 'p': {'A', 'F'}}, 'K1': {'s': {'B', 'C'}, 'p': {'A'}}} 
+0

正常工作爲好,upvoted。 – Cleb