【问题标题】:create nested dict from nested list python从嵌套列表python创建嵌套字典
【发布时间】:2021-10-01 11:33:30
【问题描述】:

我正在尝试将列表列表转换为嵌套字典。 嵌套列表如下所示(包含日期的列表列表):

[[11, 'January', 2021],
 [12, 'January', 2021],
 [13, 'January', 2021],
 .
 .
 .
 [13, 'June', 2022],
 [14, 'June', 2022],
 [15, 'June', 2022]]

目标如下:

{2021:{'January':[11,12,13,14,15,16,17,18,19,....],'February':[1,2,3,4,5,6,7,8,9,....],'March':....},
 2022:{'January':[1,2,3,4,5,6,7,8,9,....],'February':[1,2,3,4,5,6,7,8,9,....],'March':....}
 }

我完全被卡住了,无法弄清楚。有人有想法吗?

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 只是想要一些清晰。你是从文件中,从 API 响应中得到这个的吗?日期中的任何特殊情况,例如我可以在预期结果中看到 1 月的日期从 11 开始,您尝试过什么,任何伪代码?
  • 数据是否按年和月排序?
  • 这能回答你的问题吗? Converting list of tuples into a dictionary

标签: python dictionary nested


【解决方案1】:

众多方法之一:

from collections import defaultdict
import json
dates = [[11, 'January', 2021],
 [12, 'January', 2021],
 [13, 'January', 2021],
 [13, 'June', 2022],
 [14, 'June', 2022],
 [15, 'June', 2022]]
 
out = defaultdict(lambda: defaultdict(list))
for date in dates:
    d, month, year = date
    out[year][month].append(d)
    
print (json.dumps(out))

输出:

{"2021": {"January": [11, 12, 13]}, "2022": {"June": [13, 14, 15]}}
    

【讨论】:

  • 如果没有json.dump(),还有其他方法可以使它成为一个普通的字典吗?
  • 刚刚添加了 json 来打印它,否则 dict 已经创建为 out。如果你只是做print(out) 那也可以
  • 非常感谢 :) 这正是我所需要的!
  • 酷!很高兴我能帮上忙! :-)
【解决方案2】:

这是使用字典理解和itertools.groupby 的可能解决方案:

from itertools import groupby

{year: {month: list(zip(*v))[0] for month, v in groupby(x, lambda x: x[1])}
 for year, x in groupby(sorted(l, key=lambda x: (x[2], x[1])), key=lambda x: x[2])
}

输出(我从一月改到二月):

{2021: {'February': (13,), 'January': (11, 12)}, 2022: {'June': (13, 14, 15)}}

【讨论】:

  • 更简洁,但可能不太好维护,因为它可能很难理解。
  • @bastantoine 是的,我同意,我个人会选择其他答案;)
  • 啊,您发布 ii 仅仅是为了找到更短的答案吗? ^^
  • @bastantoine 我不知道美丽,但是是的,我喜欢找到解决方案作为理解和/或使用 itertools :p
【解决方案3】:
from collections import defaultdict

ans = [
 [11, 'January', 2021],
 [12, 'January', 2021],
 [13, 'January', 2021],
 [13, 'June', 2022],
 [14, 'June', 2022],
 [15, 'June', 2022]
]

finalDict = defaultdict(lambda : defaultdict(list))

for day, month, year in ans:
    finalDict[year][month].append(day)

print(finalDict)


【讨论】:

  • 您是否只是复制/粘贴了@Bhagyesh Dudhediya 的答案,刚刚删除了json.dump()?
  • 是的,看起来很像
  • 不,我没有复制他的答案。请考虑提交时间,我们几乎都在同一时间(3 分钟差)提交。但是还是很抱歉,下次我会在提交任何答案之前检查。
猜你喜欢
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2021-11-20
  • 2021-04-19
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多