python字典型由值查询键

python字典型由值查询键

从值查询键:

list(dict.keys())[list(dict.values()).index(i)]

分析一下:

dict = {0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}
dict.values()
# dict_values(['J', 'K', 'L', 'M', 'N', 'O', 'x', 'y', 'U', 'V', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', '7', '8', '9', 'P', 'Q', 'I', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', 'R', 'S', 'T', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', '+', '/', '='])

可以看到,该函数是以’dict_values’ 对象形式返回整个字典的键值

那么先把这个对象形式转换为列表形式(使用list()函数)

list(dict.values())
# ['J', 'K', 'L', 'M', 'N', 'O', 'x', 'y', 'U', 'V', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', '7', '8', '9', 'P', 'Q', 'I', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', 'R', 'S', 'T', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', '+', '/', '=']

这样返回的数据就是列表形式了;这样有什么用呢?

重要的是接下来使用index()函数进行查找我们已知的值;

返回寻找的值在这个列表中的索引

list(dict.values()).index("X")
# 39

PS:在我举的这个例子中这个索引值已经是键值了,但是这是特殊情况,我们需要推广到一般情况

再来看到

list(dict.keys())
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64]

同理,先使用keys()函数返回dict_keys的对象形式,再用list()函数转换为列表类型

那么

list(dict.keys())[list(dict.values()).index(i)]

相当于前面是键值组成的列表,后面[ ]内的是索引值(整数)

我们都知道list[i]的形式是返回列表中第i个元素

所以这样就实现了在字典类型中由值查询键的操作

CTF例题 base???

dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}

chipertext = "FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw"

实际上就是换了加密表的base64

根据base64的原理Base64编码工具以及原理(在网页最下方)

进行解码操作


dict = {0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}
chipertext = "FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw"
c1 = ""
for i in chipertext:
    # print(str(bin((list(dict.keys())[list(dict.values()).index(i)])))[2:].zfill(6))
    # c1 += str(bin(list(dict.keys())[list(dict.values()).index(i)]))[2:].zfill(6)
    c1 += str(bin(list(dict.values()).index(i)))[2:].zfill(6) # 这里就是我说的特殊情况,索引值就是键值了
print(c1) 
for i in range(0,len(c1),8):
    print(chr(int(c1[i:i+8],2)),end="")

参考文章

Python字典如何根据值返回键 - 137point5 - 博客园 (cnblogs.com)

Python 字典(Dictionary) | 菜鸟教程 (runoob.com)

你可能感兴趣的:(密码学知识总结,python)