枚举字典

时间:2018-02-09 08:29:39

标签: python python-3.x dictionary

我正在编辑这样一个字典,并且正计划将这些价值观弄清楚。

梁宁_产品思维30讲 = {
'发刊词':['产品能力是每个人的底层能力', '案例:用户体验与结婚教练'],
'同理心':['同理心训练:怎样理解愉悦与不爽', '同理心训练:怎样理解愤怒与恐惧', '同理心训练:产品要顺应用户潜意识', '认清人的本性,理解角色化生存', '自我与自律, 哪一种更贴近产品精神'],
'机会判断':['机会判断:点线面体的战略选择', '机会判断:怎样找到有势能的趋势', '痛点,痒点,爽点,都是产品机会', '两套经典的用户画像', '设计产品时要包括产品的场景'],
'系统能力':['怎样用系统能力给人提供确定性', '系统效率:小米效率的革命', '系统世界观:微信/米聊/陌陌','系统迭代:微信红包的意外与刻意', '系统生死线:猎豹和它的关键任务'],
'用户体验':["用'用户价值公式'衡量创新", "用'交叉视角'跨界创新", '怎样从新要素到新物种', '三级火箭:深度讲解互联网降维打击', '颠覆式创新:成败价值网'],
'产品世界观':['从产品中的微观, 中观和宏观视角', '人生逻辑大于商业逻辑', '产品连接客观世界/过去与将来']}

首先,我使用OrderedDict

保留其订单
from collections import OrderedDict
d = OrderedDict(梁宁_产品思维30讲)

其次,用字典理解进行枚举

In [46]: {k:list(enumerate(v,start=1)) for item in d.items() for k, v in item}
ValueError: too many values to unpack (expected 2)

不幸的是,我必须尝试一种复杂的方法。

new_d = {}
for item in d.items():
    for k, v in item:
        new_item = {k:list(enumerate(v, start=1))}
    new_d.update(new_item)

它再次使用

报告了同样的错误
ValueError: too many values to unpack (expected 2)

我的解决方案有什么问题?

1 个答案:

答案 0 :(得分:0)

您可以在迭代过程中直接提取键和值:

new_d = {}
for k, v in d.items():
    new_item = {k:list(enumerate(v, start=1))}
    new_d.update(new_item)

print(new_d)

这会将您的字典理解转换为

{k:list(enumerate(v,start=1)) for k, v in d.items()}

在您的代码中item是一个元组,表示一个键值对。您现在告诉Python使用您的行迭代元组

 for k, v in item:

并从每个元素中解压缩两个变量的值。这失败了,因为你的密钥长于两个字符。您可以在以下示例中看到此行为的模拟(我在此处使用元组列表,因为未定义字典中的顺序):

dict_item = [("AB", [3, 4], "a7"), ("xy", "12"), ("de", [5, 6, 7], 43)]

for item in dict_item:
    for k, v in item:
        print(k, v)

正如您所看到的,只要元素是可迭代的(字符串或列表)并且只有两个元素可以解压缩,一切正常。如果元素不可迭代(如整数43),Python会告诉您该对象不可迭代。如果元素较长,它会告诉您变量中的值多于预期值 - “解压缩的值太多(预期2)”错误消息。相反的情况也可能发生,即价值低于变量。然后你会得到错误消息“没有足够的值解压缩(预期2,得1)”。