【问题标题】:Converting nested List to Dictionary | Python将嵌套列表转换为字典 | Python
【发布时间】:2021-09-25 09:06:23
【问题描述】:

我制作了一个list comprehension 来生成模拟指纹数据。

import random

val = [[hand, [digit, [[random.randint(1, 250) for i in range(0, 8)] for j in range(0, 4)]]] for hand in ['Left', 'Right'] for digit in ['Thumb', 'Index', 'Middle', 'Ring', 'Little']]
val
>>> [['Left',
  ['Thumb',
   [[247, 115, 74, 161, 47, 31, 231, 34],
    [246, 52, 1, 160, 196, 65, 4, 118],
    [128, 219, 128, 140, 207, 2, 156, 226],
    [127, 61, 56, 151, 169, 122, 117, 105]]]]
...
 ['Right',
  ['Thumb',
   [[229, 222, 138, 230, 86, 119, 201, 209],
    [106, 238, 191, 15, 214, 134, 77, 145],
    [186, 174, 81, 143, 138, 5, 54, 148],
    [176, 85, 205, 235, 228, 204, 91, 17]]]]

注意:“数字”表示手指名称。

基于此列表输出,我想将其转换为以下结构的字典。

我无法创建一个dictionary comprehension 来产生所需的输出:

{
  "Left":
  {
    "Thumb": [...],
    "Index": [...],
    "Middle": [...],
    "Ring": [...],
    "Little": [...]
  },
  "Right":
  {
    "Thumb": [...],
    "Index": [...],
    "Middle": [...],
    "Ring": [...],
    "Little": [...]
  }
}

注意:我理解我上面的字典“输出”有些不正确。


我正在使用Jupyter Notebooks。最佳尝试:

output = {hand: {digit: matrix for i in val for hand in val[i] for digit in hand}}
output
>>> ---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-46-500095a8cf85> in <module>
----> 1 output = {hand: {digit: matrix for i in val for hand in val[i] for digit in hand}}
      2 output

NameError: name 'hand' is not defined

【问题讨论】:

  • 我也对 json 和字典感到困惑。这是我感兴趣的字典。
  • val = {hand: {digit: [random.randint(1, 250) for i in range(0, 8)] for digit in ['Thumb', 'Index', 'Middle', 'Ring', 'Little']} for hand in ['Left', 'Right']}?还是要将当前结构转换为dictdictlist
  • 您的解决方案非常完美!太感谢了。这也意味着少了一步。把它作为一个答案,我会点击接受。如果我写它,我必须等待 2 天才能接受,这就是为什么。又是 Tysm。

标签: python-3.x list dictionary random list-comprehension


【解决方案1】:

您可以直接使用dict 理解来创建结构。

import random
output = {
    hand: {
        digit: [
            random.randint(1, 250) for _ in range(0, 8)
        ] for digit in ['Thumb', 'Index', 'Middle', 'Ring', 'Little']
    } for hand in ['Left', 'Right']
}
print(output)

嵌套推导的诀窍是首先创建最内部的结构,然后从那里向外工作。

所以创建你的内心list

inner = [random.randint(1, 250) for _ in range(0, 8)]

然后是您的dict 位数。

digits = {digit: inner for digit in ['Thumb', 'Index', 'Middle', 'Ring', 'Little']}

最后是你的dict 手牌。

hands = {hand: digits for hand in ['Left', 'Right']}

将这些结合在一起,你就得到了。

{
    hand: {
        digit: [
            random.randint(1, 250) for _ in range(0, 8)
        ] for digit in ['Thumb', 'Index', 'Middle', 'Ring', 'Little']
    } for hand in ['Left', 'Right']
}

【讨论】:

  • “首先创建你最里面的结构,然后从那里向外工作。”这就是我需要的洞察力。泰
猜你喜欢
  • 2020-05-16
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2022-12-05
  • 2017-07-29
相关资源
最近更新 更多