【问题标题】:Making or Predefining Structure of Nested Dictionary/JSON || Python嵌套字典/JSON的制作或预定义结构|| Python
【发布时间】:2017-06-11 18:46:18
【问题描述】:

输入:我有一个包含 3 列的 Excel 文件,Excel 文件的格式如下:

A   C   D
A   C   E
A   F   G
B   H   J
B   H   K
A   F   I
B   L   M
B   L   N
A   F   O

我希望从上面的输入中制作字典,格式如下: 输出:

dictionary= {'A':{'C':['D','E'],'F':['G','I','O']},'B':{'H':['J','K'],'L':['M','N']}}

逻辑:对于每个不同的column-1值,需要制作嵌套字典&在该嵌套部分,对于每个不同的column-2值,需要制作相应的column-3值列表。

【问题讨论】:

    标签: python json dictionary collections nested


    【解决方案1】:

    @Edchum @MYGz
    谢谢!!但是没有使用熊猫,我最终做了这样的事情。

    from xlrd import open_workbook
    from nested_dict import nested_dict
    
    book = open_workbook(input_file_location) # location of excel file 
    sheet_3=book.sheets()[2] #sheet_3 in which i have data
    data_sheet_3  = [sheet_3.row_values(i) for i in xrange(sheet_3.nrows)] # getting data of sheet-3
    # specifying 2-level of nesting
    #format of dictionary: {'Key1':{'Key2':['Value1','value2']},'Key3':{'Key4':['Value3','value4']}} 
    dictionary=nested_dict(2,list) 
    for row_no in xrange(sheet_3.nrows):
            col_1=data_sheet_3[row_no][0]
            col_2=data_sheet_3[row_no][1]
            col_3=data_sheet_3[row_no][2]
            dictionary[col_1][col_2].append(col_3)
    
    print dictionary
    

    nested_dict(2,list) 是代码中的主要重点,它允许我指定两个嵌套级别。

    如果您发现在 python 中预定义嵌套字典结构的更好或替代方法,请与示例分享。

    【讨论】:

    • 好。你也可以使用 defaultdict。
    • @MYGz,你能不能为 defaultdict 写代码。据我所知,使用默认字典只有一层嵌套。 1) 从集合导入 defaultdict 2) dictionary=defaultdict(list) .. 它会创建 {'KEY':[Value,value1,value2]}。请使用默认 dict/dict.setdefault() 分享上述问题的代码。谢谢!!
    【解决方案2】:

    你可以用 pandas 这样做:

    import pandas as pd
    
    df = pd.read_excel('excel_file', header=None)
    d = {}
    for b in df.groupby([0,1])[2].apply(list).to_frame().iterrows():
        if b[0][0] not in d:
            d[b[0][0]] = {b[0][1]: b[1].tolist()[0]}
        else:
            d[b[0][0]][b[0][1]] = b[1].tolist()[0]
    print d
    

    输出:

    {'A': {'C': ['D', 'E'], 'F': ['G', 'I', 'O']}, 'B': {'H': ['J', 'K'], 'L': ['M', 'N']}}
    

    【讨论】:

    • 我没有想到一个完全不同的方法,所以这看起来不错 +1
    • @EdChum,我最后做了一些没有熊猫的事情。 nested_dict 在这里工作。请检查代码作为新答案!
    猜你喜欢
    • 2018-05-31
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2019-03-22
    • 2019-09-17
    相关资源
    最近更新 更多