繁体   English   中英

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

[英]Accessing an element in tuple in a dictionary Python

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

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

 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)如何使它们适用于那些元素?

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

  • 对于特殊情况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'

请注意,出于完整性考虑,我只是将其包括在内,我认为它并不优雅。

您需要知道您实际使用的操作是什么。 something in some_dictionary内容并不是您当时偶然想要的“在”测试中任意定义的概念。 它测试something是否是some_dictionary的键。 9 不是 subfix的键,因此subfix 9正确返回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'}

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

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

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

最简单的:

 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',)

要将多键字典解压缩为将单个键映射到值的字典,请执行以下操作:

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

请注意,这并不意味着您原始的数据结构是一个好主意(正如Ben所说,它具有混淆的类型),但是也知道如何执行此操作,尤其是如何使用嵌套的生成器(或列表)理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM