将带有字典列表的 defaultdict(list) 字典转换为 csv 的最佳方法

     2023-02-15     277

关键词:

【中文标题】将带有字典列表的 defaultdict(list) 字典转换为 csv 的最佳方法【英文标题】:Best way to convert a defaultdict(list) dictionary with list of dictionaries to a csv 【发布时间】:2022-01-20 01:23:05 【问题描述】:

我的默认字典有一个地址键,并且有一个与该键匹配的字典列表。我想将此默认字典导出到 csv 文件。

见下文:

Right now my structure looks like this defaultdict(list)
#As you can see 1 key with multiple matching dictionaries. 
#And im just copying 1 address but I have ~10 w/ varying matches

defaultdic1 = 

defaultdict(list,
            'Address_1': ['Name': 'name',
               'Address_match': 'address_match_1',
               'ID': 'id',
               'Type': 'abc',
              'Name': 'name',
               'Address_match': 'address_match_2',
               'ID': 'id',
               'Type': 'abc',
              'Name': 'name',
               'Address_match': 'address_match_3',
               'ID': 'id',
               'Type': 'abc'])

我试过这样做:

json_data = json.dumps(data_json, indent=2)

jsondf = pd.read_json(json_data, typ = 'series')

and my result was this:

Address 1       ['Name':'name', 'Address_match':'address_match_1' 'ID' : 'id', 'Type':'abc' 'Name':'name', 'Address_match':'address_match_2' 'ID' : 'id', 'Type':'abc', 'Name':'name', 'Address_match':'address_match_3' 'ID' : 'id', 'Type':'abc']

结果/输出:

我想把它导出到一个 excel 文件中

更新我试过了。第一行正在打印密钥,但第二行仍在 中,最好将它们从括号中取出并移到列中。有什么提示吗?

    for k, v in defaultdict.items():
        f.writerow([k])
        for values in v:
            f.writerow([values])

results in CSV are:

Address 1

'Name':'name', 'Address_match':'address_match_1' 'ID' : 'id', 'Type':'abc'
'Name':'name', 'Address_match':'address_match_1' 'ID' : 'id', 'Type':'abc'
'Name':'name', 'Address_match':'address_match_2' 'ID' : 'id', 'Type':'abc'

我希望我的结果是:

Address 1                Name, Address_match1, ID, Type
                         Name, Address_match2, ID, Type
                         Name, Address_match3, ID, Type

Address 2                Name1, Address_match1, ID, Type
                         Name1, Address_match1, ID, Type

Address 3                Name1, Address_match1, ID, Type
                         Name1, Address_match1, ID, Type

【问题讨论】:

您的第一个代码 sn-p 无法运行... 很抱歉,您的问题是什么? 我并不是要粗鲁,但您确实需要精确地指定您的输入和您想要的输出精确地 也许您应该使用for-loop 分别处理列表中的每个元素并将每个元素放在新行中。这不需要JSON 我在考虑for key, val in jsondefaultdic1.items(): for item in val: print(key, item)jsondefaultdic2也是如此 【参考方案1】:

您的输入数据和输出数据不匹配,因此很难判断如何转换,但这里有一些东西可以使用您的 defaultdict 并将其转换为 CSV 文件:

import csv

dic1 = 'Address_2': 
    [
        'Address 1': 
            [
                'Name':'name', 'Address_match':'address_match_1', 'ID':'id', 'Type':'abc'
            ]
        ,
        'Address 2': 
            [
                'Name':'name', 'Address_match':'address_match_2', 'ID':'id', 'Type':'abc'
            ]
        , 
        'Address 3': 
            [
                'Name':'name', 'Address_match':'address_match_3', 'ID':'id', 'Type':'abc'
            ]
        
    ]


names = list(dic1['Address_2'][0]['Address 1'][0].keys())

myfile = csv.DictWriter( open('xxx.csv','w'), fieldnames = names  )
for row in dic1['Address_2']:
    myfile.writerow('Name':list(row.keys())[0])
    myfile.writerow(list(row.values())[0][0])

【讨论】:

非常感谢这篇文章,我真的很感激。我调整了我的输入和输出,所以它们应该是匹配的。我还意识到我没有像您为 dict1 发布的字典格式,而是有一个字典,里面有一个字典列表。请查看我的更改。 这就是我的代码中的内容:一个带有字典列表的字典。 是的。我是 defaultdics(lists) 的新手。这对我有用 - > names = list(Address2'][0].keys()) ,但是 names = list(dic1['Address_2'][0]['Address 1'][0].keys())给我一个错误说'str'对象没有属性'keys'。我认为这是因为我有 1 个带地址的密钥。然后在那个钥匙里面我没有另一个钥匙。 嗯,有一些混乱,因为您目前在“见下文”中显示的内容根本不是字典。它是一个字典列表。您根本没有根目录下的“Address_2”。 是的,我在上面输入了 cmets (#),它只有 1 个地址,但我有 ~10 个。无论如何,感谢您的帮助,我能够解决它!真的很感激。我实际上没有使用 DictWriter 我是使用 writer 完成的。【参考方案2】:

这就是最终解决它的原因!

names = list(dic1['Address_1'][0].keys())
f.close()
with open ("file.csv", "w", newline="") as f:
    writer = csv.writer(f)
    keys = names
    writer.writerow(["Address"] +(keys))
    for k, vl in defaultdict.items():
        for v in vl:
            writer.writerow([k] + [v[key] for key in keys])
f.close()

【讨论】:

就像对未来的评论一样,请确保当您提出问题时,您的示例数据确实反映了您的示例数据。 @TimRoberts 会的!你的名字变量让我感动,没有你的帮助是做不到的。谢谢

从字典的 defaultdict(list) 中删除 nan 值

】从字典的defaultdict(list)中删除nan值【英文标题】:removenanvaluesfromdefaultdict(list)ofdicts【发布时间】:2022-01-2306:43:34【问题描述】:我通过运行一些分析创建了以下代码,并将结果放入defaultdict(list)中。之后,我将结果放入csv文件... 查看详情

defaultdict

defaultdict的例子使用list作为default_factory,他很容易的将一个以键值形式表现的序列分组成一个字典列表>>>s=[(‘yellow‘,1),(‘blue‘,2),(‘yellow‘,3),(‘blue‘,4),(‘red‘,1)]>>>d=defaultdict(list)>>>fork,vins:...d[k].a 查看详情

defaultdict(list) 将所有值连接到一个列表中

】defaultdict(list)将所有值连接到一个列表中【英文标题】:defaultdict(list)concatenatingallthevaluesintoonelist【发布时间】:2016-01-1112:21:06【问题描述】:我想做什么:编写一个方法来对一个字符串数组进行排序,这样所有的anagrms都是彼... 查看详情

附加两个带有多个字典的列表 Python

】附加两个带有多个字典的列表Python【英文标题】:AppendingtwolistswithmultipledictsPython【发布时间】:2021-01-3100:33:29【问题描述】:我有五个字典dic1,dict2,dict3,dict4,dict5。我正在尝试将dict-keys附加到两个列表list1,list2。dict1="brand":"Ford"... 查看详情

将字典复制到 defaultdict

】将字典复制到defaultdict【英文标题】:Copyingadictionarytodefaultdict【发布时间】:2015-11-0608:06:00【问题描述】:我想有效地将​​字典复制到defaultdict。这是我的代码:[In]fromcollectionsimportdefaultdict[In]new_dict=\'a\':1,\'b\':2,\'c\':3,\'e\':4,\... 查看详情

defaultdict默认字典

importcollectionsascon#默认字典数据类型(参数填数据类型)dic=con.defaultdict(list)dic[‘a‘].append(55)print(dic,‘defaultdict‘)   查看详情

使用字典理解过滤 defaultdict

】使用字典理解过滤defaultdict【英文标题】:Filteringdefaultdictwithdictionarycomprehension【发布时间】:2018-07-2800:27:06【问题描述】:我有一个默认字典,其中键是数字,值是列表,每个列表有两个条目。我想根据第一个条目按条件过... 查看详情

从另一个defaultdict获取价值并更新原始字典(代码片段)

...,2,3,4,5]b=[0,3,0,5,6,0]c=[2,3,4,5,6,5]d=[20,30,40,50,60,70]所以我使用defaultdict存储a,b的键值对,如:one=defaultdict(list)fork,vinzip(a,b):one[k].append(v)two=defaultdict 查看详情

字典的一些特殊用法(代码片段)

 一. 1个键对应多个值比如:d=‘a‘:[1,2,3], ‘b‘:[4,5],可以使用collections模块中的defaultdict来构造这样的字典fromcollectionsimportdefaultdict#对应的多个值是列表形式d=defaultdict(list)d[‘a‘].append(1)d[‘a‘].append(2)d[‘b‘].app 查看详情

将带有列表的字典转换为熊猫数据框

】将带有列表的字典转换为熊猫数据框【英文标题】:Convertdictionarywithlistintopandasdataframe【发布时间】:2021-09-0717:09:53【问题描述】:我有一本Python字典result_dict=\'kontonummer\':None,\'industryPredictions\':\'Supermarket\':0.006795256825841207,\'Cars... 查看详情

将带有值列表的字典转换为数据框

】将带有值列表的字典转换为数据框【英文标题】:Convertingadictionarywithlistsforvaluesintoadataframe【发布时间】:2014-10-0704:35:05【问题描述】:我花了一段时间查看SO,似乎我遇到了一个独特的问题。我有一本如下所示的字典:dict=123... 查看详情

python之字典中的键映射多个值(代码片段)

字典的键值是多个,那么就可以用列表,集合等来存储这些键值举例print("key":list())#‘key‘:[]print("key":set())#‘key‘:set()那么Python中有哪些方法能创建这样的字典呢fromcollectionsimportdefaultdictdic_list=defaultdict(list)#defaultdict(<class‘ 查看详情

如何将带有嵌套字典的列表写入 csv 文件?

】如何将带有嵌套字典的列表写入csv文件?【英文标题】:Howtowritealistwithanesteddictionarytoacsvfile?【发布时间】:2013-11-2310:32:41【问题描述】:我是Python新手,尝试了所有我能想到的方法,但找不到解决方案。我有一个列表,其中... 查看详情

python根据列表中整数的位数合并成字典

fromcollectionsimportdefaultdictnum_list=[1,2,5,23,77,344,2222,6666,4567,9]ans_dict=defaultdict(list)fornuminnum_list:key_len=len(str(num))ans_dict[key_len].append(num)print(dict(ans_dict))输出:1:[1,2,5,9],2:[23,77],3:[344],4:[2222,6666,4567] 查看详情

[py3]——字典中的键如何映射多个值?字典如何排序?

Defaultdict默认字典collections模块中的defaultdict(默认字典),可以用来构造“一个键映射多个值”这样的字典如果你想保持元素的插入顺序就应该使用list,如果想去掉重复元素就使用setimportcollectionsimportdefaultdictd=defaultdict(list)/e... 查看详情

将嵌套字典转换为 pandas 数据框并绘图

...,它以以下方式不断记录收到的消息--classListener:recorded=defaultdict(lambda:defaultdict(list))defon_message_receive 查看详情

递归遍历带有列表的嵌套字典,并替换匹配的值

】递归遍历带有列表的嵌套字典,并替换匹配的值【英文标题】:Recursivelyiteratethroughanesteddictwithlist,andreplacematchedvalues【发布时间】:2019-09-0621:26:21【问题描述】:我想创建一个函数来遍历包含列表的嵌套字典。对于每个与关键... 查看详情

将列表的javascript列表减少为列表字典[关闭]

】将列表的javascript列表减少为列表字典[关闭]【英文标题】:Reducejavascriptlistofliststoadictionaryoflists[closed]【发布时间】:2021-12-3005:26:45【问题描述】:类似于ListofListstoDictionaryofLists希望将列表列表简化为列表字典例如list_list=[[\'exa... 查看详情