我正在编写代码来识别给定数字的子修订。我有一堆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)如何使其适用于这些元素?
答案 0 :(得分:4)
由于其内部实现为哈希表,因此字典将单个键映射到单个值。虽然你可以动态构建一个具有你需要的格式的字典,但我认为考虑这个问题的另一种方法是:
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'
请注意,为了完整起见,我只是将其包括在内,我不认为这很优雅。
答案 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所说,它有一个混乱的类型),但它也知道如何做到这一点,特别是如何使用嵌套生成器(或列表)理解。