【问题标题】:Appending to nested list in python dictionary附加到python字典中的嵌套列表
【发布时间】:2022-01-18 18:01:29
【问题描述】:

我有一个带有嵌套列表作为值的字典(实际上有数千个条目,这里只是一个简化)。

my_dict = {'topic a': [['CategoryA', 230], ['CategoryB', 270]], 'topic b': [['CategoryA', 198], ['CategoryB', 188]]}

我还有两个带有浮点值的列表(有序且数量与列表值相同):list_A: [0.1, 0.1], list_B: [0.2, 0.2]

我希望遍历字典和列表,并且每个迭代步骤将 A 的浮点值附加到字典项的第一个嵌套列表,将 B 的浮点值附加到字典项的第二个嵌套列表。订单必须保持原样。

我想要的结果如下:

{'topic a': [['CategoryA', 230, 0.1], ['CategoryB', 270, 0.2]], 'topic b': [['CategoryA', 198, 0.1], ['CategoryB', 188, 0.2]]}

我尝试了很多东西;迭代将无法正常工作。请查看我的尝试之一的代码:

my_dict = {'topic a': [['CategoryA', 230], ['CategoryB', 270]], 'topic b': [['CategoryA', 198], ['CategoryB', 188]]}

list_A = [0.1, 0.1]
list_B = [0.2, 0.2]

for element in my_dict.values():
        for el in list_A:
            element[0].append(el) 
        for el_ in list_B:
            element[1].append(el_)
print(my_dict)

不想要的结果是:

{'topic a': [['CategoryA', 230, 0.1, 0.1], ['CategoryB', 270, 0.2, 0.2]], 'topic b': [['CategoryA', 198, 0.1, 0.1], ['CategoryB', 188, 0.2, 0.2]]}

我还尝试了使用 zip 的解决方法,但在尝试将 zip 转换为列表时显示“TypeError: 'list' object is not callable”也没有成功。

test = []
for element in my_dict.values():
    test = zip(element[0], list_A)
test = list(test)
print(test)

对于我的第一个示例,我实际上理解了为什么我得到了不想要的结果但无法达到想要的结果;对于 zip 尝试,我没有看到问题。任何(pythonic)想法? - 非常感谢!

更新: 字典转换为列表,仍然无法正常工作;我错过了什么?



my_list = []
for key, value in my_dict.items():
    temp = [key,value]
    my_list.append(temp)
print(my_list)  

# output: [['topic a', [['CategoryA', 230], ['CategoryB', 270]]], ['topic b', [['CategoryA', 198], ['CategoryB', 188]]]]


list_A = [0.1, 0.1]
list_B = [0.2, 0.2]


for element in my_list:
        for el in list_A:
            element[1][0].append(el) 
        for el_ in list_B:
            element[1][1].append(el_)
print(my_list)

# output: [['topic a', [['CategoryA', 230, 0.1, 0.1], ['CategoryB', 270, 0.2, 0.2]]], ['topic b', [['CategoryA', 198, 0.1, 0.1], ['CategoryB', 188, 0.2, 0.2]]]]


test = []
for element in my_list:
    test = zip(element[1][0], list_A)
test = list(test)
print(test)

# output: TypeError: 'list' object is not callable

【问题讨论】:

  • 我有一个问题。您的列表 A 和列表 B 中有一个顺序,但是我们如何确定这些浮点数以何种顺序添加到无序字典中的每个元素中,我们是否仅依赖于对 dict 值的迭代进行排序?
  • 我们可以帮助您解决这个问题,但老实说,这对于您想要做的事情来说是错误的数据结构。
  • 您好 Richard K Yu,感谢您的回复。我以为字典是有序的……也许这就是我所有问题的根源。我在字典中的目标是按照它写下来的顺序。
  • 已经谢谢了;我想我需要将字典转换为列表并从那里重试。
  • 好的,我将字典转换为列表,不幸的是我的问题仍然存在。我错过了什么?特别是关于 for 循环,我真的不知道如何附加单个列表元素而不是整个列表;可能真的很明显,但我被卡住了。请参阅上面的更新。

标签: python list dictionary nested


【解决方案1】:

当然,既然你的要求有无数种解释,我觉得这并不是你真正想要的,但还是从这里开始吧:

my_dict = {'topic a': [['CategoryA', 230], ['CategoryB', 270]],
           'topic b': [['CategoryA', 198], ['CategoryB', 188]]}

list_A = [0.1, 0.1]
list_B = [0.2, 0.2]

desired = {'topic a': [['CategoryA', 230, 0.1], ['CategoryB', 270, 0.2]],
           'topic b': [['CategoryA', 198, 0.1], ['CategoryB', 188, 0.2]]}

for outerlist, column in zip(my_dict.values(), zip(list_A, list_B)):
    for nestedlist, floatvalue in zip(outerlist, column):
        nestedlist.append(floatvalue)

assert my_dict == desired

【讨论】:

  • 非常感谢 Veky 这就是答案——或者更好的可能是无限可能的答案之一——我一直在寻找;我只是无法让我的编码尝试工作。
  • 所以这段代码实际上适用于你的“数千个条目”并给出你想要的?老实说,我很惊讶。 :-D
【解决方案2】:

这将起作用:

dict_keys = list(my_dict.keys())

for i in range(0, len(list_A)):
    val_A = list_A[i]
    val_B = list_B[i]

    my_dict[dict_keys[i]][0].append(val_A)
    my_dict[dict_keys[i]][1].append(val_B)

print(my_dict)
# {'topic a': [['CategoryA', 230, 0.1], ['CategoryB', 270, 0.2]], 'topic b': [['CategoryA', 198, 0.1], ['CategoryB', 188, 0.2]]}

【讨论】:

  • 感谢卡兹米勒;这也有效,可以帮助我理解我错在哪里!
猜你喜欢
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
相关资源
最近更新 更多