1

我正在编写一个代码来识别给定数字的子前缀。我有一堆if语句来找出子前缀。但是我认为更优雅的解决方案是字典。所以我有以下字典:

问题是,如果我写9 in subfix,结果是假的。如何访问字典中元组中的元素?

 subfix = {(0, 4, 5, 6, 7, 8, 9, 11, 12, 13): 'th', 1: 'st', 2: 'nd', 3: 'rd'}

例如,我想写一些简单的东西,例如:

def subf(a):
     if a in subfix:
           ending = subfix.get(a)
     print('We met on the ',a,ending,'.'sep='')

这将打印“我们在 1 日见面”。(但不适用于 0,4,5,6,7,8,9,11,12,13)我如何让它适用于这些元素?

4

5 回答 5

4

由于其内部实现为哈希表,字典将单个键映射到单个值。虽然您可以动态构建具有所需格式的字典,但我认为考虑这个问题的一个很好的替代方法如下:

  • 对于特殊情况和1,我们使用字典中的特殊值23
  • 对于所有其他情况,我们将th其用作后缀。

幸运的是,这里的default参数dict.get()来救援:

subfix = {1: 'st', 2: 'nd', 3: 'rd'}
def subf(a):
    ending = subfix.get(a, 'th')
    print('We met on the {}{}.'.format(a, ending))

如果它有键,这将使用字典中的值,否则它将使用th.

编辑:至于如何构建具有必要格式的字典,我们可以使用:

subfix = { 1: 'st', 2: 'nd', 3: 'rd'}
for k in (0, 4, 5, 6, 7, 8, 9, 11, 12, 13):
    subfix[k] = 'th'

请注意,为了完整起见,我只是将其包括在内,我不认为这很优雅。

于 2012-06-25T01:37:52.810 回答
4

你需要知道你正在使用的操作实际上是做什么的。something in some_dictionary不是您当时碰巧想要的任意定义的“in”测试概念。它测试是否something是 的键some_dictionary9不是一键的,所以正确返回。subfix9subfixFalse

退后一步,想想subfix它有什么作用?它是干什么用的?在这样的定义中:

subfix = {1: 'st', 2: 'nd', 3: 'rd'}

我会说这subfix表示从数字到用于每个数字的序数版本的后缀的映射。OTOH这个定义:

subfix = {(0, 4, 5, 6, 7, 8, 9, 11, 12, 13): 'th', 1: 'st', 2: 'nd', 3: 'rd'}

表示类似于“从共享一个共同的序数后缀或单个数字到它们的序数后缀的数字元组的映射”。这个定义所代表的要复杂得多,因此使用它要复杂得多。如果你有一个任意数字并且你想找到它的序数后缀,你需要找出它是否是字典中的键或者它是否是字典中任何键的元素。这意味着字典不允许您直接从数字跳转到序数后缀,也不允许您快速检查映射中是否有任何数字。所以我认为在这种情况下使用错误的数据结构;从数字到后缀的直接映射会更容易使用。

于 2012-06-25T01:50:03.857 回答
1

您需要单独使用数字作为键。您可以手动创建字典,或执行以下操作:我不确定哪个更好:

suffixes_list = [
    ((0, 4, 5, 6, 7, 8, 9, 11, 12, 13), "th"),
    ((1,), "st"),
    ((2,), "nd"),
    ((3,), "rd"),
]

suffixes = {}
for nums, suffix in suffixes_list:
    for num in nums:
        suffix[num] = suffix
于 2012-06-25T01:38:43.393 回答
0

最简单的:

 subfix = {1: 'st', 2: 'nd', 3: 'rd'}
 subfix.get(num, 'th')

get 命令将返回 st 表示 1,nd 表示 2,rd 表示 3,th 表示其他任何值。

另一种选择是使用元组,在这里你真的不需要字典。

subfix = ('','st','nd','rd','th','th','th','th','th','th',)
于 2012-06-25T01:41:54.883 回答
0

要将您的多键字典解压缩为将单键映射到值的字典:

subfix = subfix((key, value) for key in keys if isinstance(keys, tuple) else (keys,) 
                for keys in subfix.items())

请注意,这并不意味着您的原始数据结构是一个好主意(正如 Ben 所说,它有一个混淆类型),但最好知道如何做到这一点,特别是如何使用嵌套生成器(或列表)推导.

于 2012-06-25T01:55:19.323 回答