【发布时间】:2018-11-26 09:56:14
【问题描述】:
我正在尝试创建一个看起来像这样的字典(部分示例):
{(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 的随机数,这似乎更让人头疼(尽管我想这取决于是否有一个优雅的解决方案)。
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 重复,这对于通过某种理解应该是可能的似乎是不必要的。
有没有办法在一行中声明具有这种复杂性的字典?如果不是,那么声明这种常量的正确样式是什么?
【问题讨论】:
-
TRY有什么问题?这不是您期望的输出吗? -
字典真的是正确的数据结构吗?您是否考虑过使用 2D 参差不齐的列表?
-
@Austin 在上面的例子中,TRY 结束于:
{(1, 1): 'Residential', (2, 1): 'Residential', (3, 1): 'Residential', (4, 1): 'Residential', (5, 1): 'Residential', (6, 1): 'Residential',... (1, 18): 'Artists', (2, 18): 'Artists', (3, 18): 'Artists', (4, 18): 'Artists', (5, 18): 'Artists', (6, 18): 'Artists'}我想要的范围是 (1,1) 到 (6,6),18 是正确的。此外,我想将“住宅”限制为 (1,1)...(3,1),这会将所有内容循环 6 次迭代。 -
@Code-Apprentice 我不熟悉 2D 参差不齐的列表。我可以去看看。
-
@Zim 当每一行都有相同数量的元素时,通常使用二维列表。如果不是这种情况,则 2D 列表称为“不规则”。出于您的目的,这可能不是一个重要的细节,但可以为您提供一个可能相关的搜索词。
标签: python dictionary python-3.6 dictionary-comprehension