python - 用多种推导式填充字典

标签 python dictionary python-3.6 dictionary-comprehension

我正在尝试创建一个看起来像这样的字典(部分示例):

{(1, 1): 'Residential', (2, 1): 'Residential', (3, 1): 'Residential', (1, 2): 'Crafts', (2, 2): 'Crafts', (3, 2): 'Crafts', (4, 1): 'Law, Government', (5, 1): 'Law, Government', (4, 2): 'Public Space', (5, 2): 'Public Space', (6, 1): 'Vice', (6, 2): 'Entertainment'}

对于一些更聪明的解决方案来说,关键逻辑似乎是一个问题,一组值分布在 3 个键上,另一组值分布在 2 个键上,第三组值各有一个键。

我宁愿通过某种理解以编程方式创建它,而不是多次编写重复项。

USE = dict([(n, 1), "Residential"] for n in range(1, 4))

这非常有用,例如,创建它的第一部分。我可以这样做:

USE2 = dict([(n, 2), "Crafts"] for n in range(1, 4))
USE.update(USE2)

对于常量来说,这是一种困惑、不优雅且糟糕的风格。

我对任何其他策略都不知所措。

我尝试了一些形式的串行理解:

USE = dict([(n, 1), "Residential"] for n in range(1, 4),
           [(n, 2), "Crafts"] for n in range(1, 4),...

但这会失败,因为 dict() 不接受多个参数。

我做不到Python 3 unpacking generalizations :

USE = dict(**dict([(n, 1), "Residential"] for n in range(1, 4)),
           **dict([(n, 2), "Crafts"] for n in range(1, 4)),...

因为由于我不明白的原因,该样式仅限于字符串。使用字符串需要稍后转换用于引用字典的随机数,这似乎更令人头痛(尽管,我认为这取决于是否有一个优雅的解决方案)。

还有一个dict comprehension似乎不够强大(完整数据在这里:其中前 6 种常见程度是后 6 种的 3 倍):

space = ["Residential", "Crafts", "Labor", "Shops", "Trade", "Hospitality",
     "Law, Government", "Public Space", "Power", "Manufacture", "Transportation", "Leisure",
     "Vice", "Entertainment", "Storage", "Cultivation", "Academic", "Artists"]
TRY = {(y, x+1): s for x, s in enumerate(space) for y in range(1, 7)}

由于列表大小,这最终留下了我的 6x6 边界。如果我对 x 取模,它最终会覆盖条目。看来我必须编写一个专门的函数来覆盖奇怪的 3/2/1 重复,这对于通过某种理解来实现的功能来说似乎是不必要的。

是否有某种方法可以在一行中声明如此复杂的字典?如果不是,声明这种常量的正确样式是什么?

最佳答案

俗话说:

Don't write programs, write programs that write programs.

我建议启动一个交互式 session (或 IPython),创建部分字典并使用 update 来合并它们。

然后打印出合并后的dict并将其粘贴到源代码中。

关于python - 用多种推导式填充字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50894464/

相关文章:

python - CNTK Python API : evaluating hidden layers/multiple outputs

python - Pandas:如何用前一个非空值和下一个非空值的平均值填写 n/a

python - 通过 paramiko 执行长时间运行的命令

python - 不使用内置函数将python字典转换为xml字符串

python - 在 Pygame 中后台 blit 代码中创建的 TypeError

python - 建立分层评论树?

python - 将字典中的下一项与上一项进行比较

python - 用于关联字典列表和列表列表的 pythonian 单行代码

python - 用科学记数法写json float

python - 如何从同步代码 Python 调用异步函数