在Python中将嵌套列表转换为字典

4
我需要将嵌套列表 result = [[450, 455, 458], [452, 454, 456, 457], [451, 453]] 转换为以下格式的字典:
{
    0: 
         {
             450: None,
             455: 450,
             458: 450
         },
    1:   {
             452: None,
             454: 452,
             456: 452,
             457: 452
         },
    2:   {
             451: None,
             453: 451
         }

}

请看这个并协助:

请看以下内容,协助解决问题:

result_group = {}
for sub_group in result:
    group_count = 0
    first_rel_item = 0
    result_group[group_count] = dict()
    for item in sub_group:
        if item == sub_group[0]:
            result_group[group_count][item] = None
            first_rel_item = item
            continue
        result_group[group_count]['item'] = first_rel_face
        group_count += 1

我在这个过程中出了问题,因为我遇到了关键错误:1,无法添加到字典中。

4个回答

4

这是一种方法:

lst = [[450, 455, 458], [452, 454, 457], [451, 453]]

res = {i: {w: None if w == v[0] else v[0] for w in v}
          for i, v in enumerate(lst)}

结果

{0: {450: None, 455: 450, 458: 450},
 1: {452: None, 454: 452, 457: 452},
 2: {451: None, 453: 451}}

解释

  • 使用三元运算符来决定你选择 None 还是 v [0]
  • 使用 enumerate 提取嵌套列表的索引。

1

试试这个:

result_group = {}
group_count = 0
for sub_group in result:
    first_rel_item = 0
    result_group[group_count] = {}
    result_group[group_count][sub_group[0]] = None
    previtem = sub_group[0]
    for item in sub_group[1:]:
        result_group[group_count][item] = previtem
        previtem = item
    group_count += 1

刚试了一下,我得到了这个。链接 但是我需要像我在顶部提到的那样的那一个。欢迎您的建议。 - Krish V
非常奇怪,因为我得到了{0: {450: None, 455: 450, 458: 450}, 1: {452: None, 454: 452, 457: 452}, 2: {451: None, 453: 451}} - uvgroovy
使用Python 3.6.3 - uvgroovy
请确保空格正确 - 即group_count不应出现在内部循环中。 - uvgroovy
我从你的回答中得到了我需要的东西。太棒了!谢谢 @uvgroovy - Krish V

1
您可以在此处使用列表推导式:

>>> result = [[450, 455, 458], [452, 454, 457], [451, 453]]

>>> dict(enumerate({**{i: a[0] for i in a[1:]}, **{a[0]: None}}
                   for a in result))

{0: {450: None, 455: 450, 458: 450},
 1: {452: None, 454: 452, 457: 452},
 2: {451: None, 453: 451}}

注意:这里使用了Python 3.5中引入的"extended"可迭代解包。 z = {**x, **y}合并字典xy
每个a都是result的子列表。您希望将a[0]用作第1个及以上元素的值,并将0th元素设置为None。
这里的假设是,您只想让子列表的第0个元素具有相应的None值。(如果第0个元素在其他地方重复出现,则会使用第0个元素作为其值,例如@jpp的答案。)

0
# the nice solutions were already given, so by foot:

d = {}
result = [[450, 455, 458], [452, 454, 457], [451, 453]]

for idx,l in enumerate(result): # returns the index and the sublists data
    rMin = min(l)
    d[idx] = {}  # create a inner dict at key idx
    for i in l:
        d[idx][i] = None if i == rMin else rMin   # fill inner dicts keys

print(d)

输出:

{0: {450: None, 455: 450, 458: 450},
 1: {452: None, 454: 452, 457: 452},
 2: {451: None, 453: 451}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接