【问题标题】:Appending to a dictionary of lists elements from a nested list in order按顺序附加到嵌套列表中的列表元素字典
【发布时间】:2023-04-10 22:03:02
【问题描述】:

我创建了一个字典,其中包含表示相对距离的键和空列表的值。我想用嵌套列表中的条目填充这些值——空列表——这些条目是相对距离的值。我的问题是,当我填充字典的值时,它的条目没有按照它们在嵌套列表中出现的顺序填充。

这是我最接近解决问题的方法:

relDistDic = { 'a':[], 'b': [] } # dictionary with relative distances

relDist = [[1,2,3], [4,5,6], [7,8,9], [10,11,12] ] #nested list with dstncs

for v in relDistDic.values():
    for element in relDist:
        if len(v) < 2 :
            v.append(element)

我想得到以下输出:

{ 'a':[[1,2,3], [4,5,6]], 'b': [[7,8,9], [10,11,12]] }

但是我得到了这个:

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

非常感谢任何帮助或 cmets,谢谢!

【问题讨论】:

  • 对于初学者,您通常不应将dict 对象视为有序对象,尽管它们在 Python 3.7+ 中有序的。但是,只有来自 relDist 的前两个值的原因是因为您总是从头开始迭代:for element in relDist...

标签: python list dictionary nested append


【解决方案1】:

字典是无序的!您插入带有 not 的元素的顺序与您在遍历它们时出现的顺序相同。

不仅如此,在

for v in relDistDic.values():
  for element in relDist:
    if len(v) < 2:
      v.append(element)

对于relDist 中的每个值,您只需附加前两个(因为if len(v) &lt; 2)。也许您打算在附加它们时从 relDist 中删除它们?

为此,请使用pop()

for v in relDistDic.values():
  for i in range(2):
    if len(relDist) > 0:
      v.append(relDist.pop(0))

【讨论】:

  • 那将是理想的,但我还没有找到一种方法将前两个元素弹出到第一个键“a”中,然后将其余两个元素弹出到键“b”中。
  • 两个好点!我认为您的第二点可能与 OP 所询问的特定行为更相关,因为他们正在为字典中的每个元素重新启动迭代。除了删除项目之外,枚举或计数器也可能有助于解决问题。关于字典中缺乏秩序的观点肯定会导致其他不可预见的问题。
【解决方案2】:

怎么样:

relDist = [[1,2,3], [4,5,6], [7,8,9], [10,11,12] ] #nested list with dstncs

relDistDic = { 'a': relDist[:2], 'b': relDist[2:] } # dictionary with relative distances

【讨论】:

  • 这适用于我试图解决的这个简单版本的问题。但是,我可以有 13 个键到 96 个键。如果我们以 13 键字典为例,我有一个嵌套的列出我要分配的 29,952 个元素:第一个 2,304 我想进入第一个键,接下来的 2,304 个进入第二个键,依此类推,直到我到达第十三个键并用剩余的键填充它2,304 个元素。
猜你喜欢
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 2021-07-02
相关资源
最近更新 更多