在字典Python中访问元组中的元素

时间:2012-06-25 01:33:53

标签: python

我正在编写代码来识别给定数字的子修订。我有一堆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)如何使其适用于这些元素?

5 个答案:

答案 0 :(得分:4)

由于其内部实现为哈希表,因此字典将单个键映射到单个值。虽然你可以动态构建一个具有你需要的格式的字典,但我认为考虑这个问题的另一种方法是:

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

幸运的是,dict.get()default参数在这里得到了拯救:

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

如果它有密钥,这将使用dict中的值,否则它将使用th

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

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

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

答案 1 :(得分:4)

您需要知道您实际使用的操作。 something in some_dictionary不是任何你在当时想要的“在”测试中任意定义的概念。它会测试something是否为some_dictionary的关键字。 9 subfix的密钥,因此9中的subfix正确返回False

退一步思考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'}

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

答案 2 :(得分: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

答案 3 :(得分: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',)

答案 4 :(得分:0)

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

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

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