[英]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)如何使它们适用于那些元素?
由于其内部实现为哈希表,因此字典将单个键映射到单个值。 虽然您可以动态构造具有所需格式的字典,但我认为考虑此问题的一种不错的替代方法如下:
1
, 2
和3
,我们用特殊值从字典 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.