【问题标题】:Appending an int key in a dictionary在字典中附加一个 int 键
【发布时间】:2021-01-20 15:09:27
【问题描述】:

我正在尝试从以下列表中创建字典:

link_i = [1, 1, 3, 3, 3, 4, 4, 5, 5, 6]
link_j = [2, 3, 1, 2, 5, 5, 6, 6, 4, 4]

link_i = [1, 1, 3, 3, 3, 4, 4, 5, 5, 6]
link_j = [2, 3, 1, 2, 5, 5, 6, 6, 4, 4]
nodes = [1, 2, 3, 4, 5, 6]

# Creating a dictionary containing nodes and their incoming links:
out_dict =  {}
for i in nodes:
    for j in range(0,len(link_i)):
        if (link_i[j] == i):
            if i not in out_dict:
                out_dict[i] = link_j[j]
            elif i in out_dict:
               out_dict[i].append(link_j[j])

但是,我无法附加密钥,因为它的类型为 int。我得到了错误:

line 21, in <module>
    out_dict[i].append(link_j[j])

AttributeError: 'int' object has no attribute 'append'

我正在尝试将输出设为:

{1: [2, 3], 3: [1, 2, 5], 4: [5, 6], 5: [6, 4], 6: [4]}

【问题讨论】:

  • 好吧,out_dict[i].append(link_j[j]) 绝对不正确。我想应该是out_dict.append(i, link_j[j])
  • 但是 out_dict 是一个字典,然后你会得到AttributeError: 'dict' object has no attribute 'append'
  • 对不起,我错了——我不是 Python 专家。根据docs.python.org/3/tutorial/datastructures.html 的第 5.5 节,out_dict[i] = link_j[j] 可以工作。
  • 您好,当 i 不是字典的键时,这在第一个 if 循环中有效。当它已经是一个键时,它不会追加,而是用一个新值替换该值。我想要这两个键的值。这是我无法弄清楚的。

标签: python-3.x list dictionary integer


【解决方案1】:

为了保持代码简单,您可以使用 dict comprehension 并将每个节点的默认值设置为空列表。这样您就不需要检查节点是否已经是字典的一部分,您只需附加链接即可。

link_i = [1, 1, 3, 3, 3, 4, 4, 5, 5, 6]
link_j = [2, 3, 1, 2, 5, 5, 6, 6, 4, 4]
nodes = [1, 2, 3, 4, 5, 6]

# Creating a dictionary containing nodes and their incoming links:
# fill the dict with empty lists for each node
out_dict =  {node: [] for node in nodes}
for i in nodes:
    for j in range(0,len(link_i)):
        if (link_i[j] == i):
            # append link to the list for the node
            out_dict[i].append(link_j[j])

然后输出如下所示:

{1: [2, 3], 2: [], 3: [1, 2, 5], 4: [5, 6], 5: [6, 4], 6: [4]}

【讨论】:

  • 这也有助于为节点 2 打印一个空列表,因为该节点的链接为零。这真的很有帮助。谢谢。
【解决方案2】:

你需要改变:

if i not in out_dict:
    out_dict[i] = link_j[j]

if i not in out_dict:
    out_dict[i] = [link_j[j]]

这是因为在您首次将键“i”添加到 out_dict 之后,您为其分配了一个 int 类型的单个值。为了能够添加到此,稍后,它需要是可变数据类型,例如具有属性附加的列表。这并不能解决您的所有问题,因为即使进行了此更改,您仍然无法获得所需的输出,但它可以让您进一步调试。

【讨论】:

  • 是的,这解决了错误,我认为问题应该出在循环中,但我现在得到了一个包含一些值的字典,我可以进一步工作。谢谢!
  • 不用担心。希望你能解决循环
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2021-03-04
  • 2018-01-16
  • 2017-04-10
  • 2014-04-22
相关资源
最近更新 更多