Python:组合字典值

Python:组合字典值,python,Python,为了学习python,我正在构建一个生成随机密码的测试程序,实际上我正在使用这段代码列出可能使用的字典: def symbol_switcher(arg): switcher = { 1: DICTIONARY_LETTERS_UPPER, 2: DICTIONARY_LETTERS_LOWER, 3: DICTIONARY_NUMBERS_DEC, 4: DICTIONARY_SYMBOLS } retur

为了学习python,我正在构建一个生成随机密码的测试程序,实际上我正在使用这段代码列出可能使用的字典:

def symbol_switcher(arg):
    switcher = {
        1: DICTIONARY_LETTERS_UPPER,
        2: DICTIONARY_LETTERS_LOWER,
        3: DICTIONARY_NUMBERS_DEC,
        4: DICTIONARY_SYMBOLS
    }
    return switcher.get(arg)
我通过命令行询问用户想要使用什么词典,这样任何组合都可以工作。在切换器中,上述值为1~4,但我需要构建它,使值为1,2,4,8,接受范围1~15内的任何值,例如11(I,2,8)表示第一、第二和第四字典

我如何将用户选择的结果分配给我的
字典(使用
变量),而不必执行多个
if
(如果),也不必根据可能的组合评估值?

简而言之,python中是否有类似的功能

#assign the resulting join of switcher elements
dictionary_touse = symbol_switcher(11)
编辑

我实际上使用了这种方法,它可能是错误的,这不是我想要的,如果这有助于:

此方法的问题是,我遇到了以下错误:

TabError:缩进中制表符和空格的使用不一致


编辑:显然记事本++喜欢添加任意制表符而不是空格,这让python很生气,我显示了符号,并用四个空格替换了所有制表符的缩进位置。

我想你可以这样做:

def symbol_switcher(arg):
    switcher = {
        1: DICTIONARY_LETTERS_UPPER,
        2: DICTIONARY_LETTERS_LOWER,
        3: DICTIONARY_NUMBERS_DEC,
        4: DICTIONARY_SYMBOLS
    }
    return [switcher.get(key) for key in switcher if key & arg]

如果我很了解你的问题,我想你可以:

def symbol_switcher(arg):
    switcher = {
        1: DICTIONARY_LETTERS_UPPER,
        2: DICTIONARY_LETTERS_LOWER,
        3: DICTIONARY_NUMBERS_DEC,
        4: DICTIONARY_SYMBOLS
    }
    # return the power p + 1 corresponding to the power decomposition of 2 of arg
    # p+1 is related to the numbers in switcher
    list_ind = [p+1 for p,v in enumerate(bin(arg)[:1:-1]) if int(v)]
    # get a list of dictionnary define in switcher linked to element of list_ind
    list_dict = [switcher.get(i) for i in list_ind]
    # Create a concatenate dictionnary with all items of all dictionary selected.
    return {k: v for d in list_dict for k, v in d.items()}

我会这样编码,将示例位掩码与(此处:常量而不是变量)结合起来,并使用字符串连接操作将其连接起来,给出一个字符串结果:

def symbol_switcher(control):
    return "".join([s for i, s in zip((1, 2, 4, 8), 
                                      ("ABC", "abc", "123", "+-:.")) 
                    if i & control])

为什么11对应于第一(1)、第二(2)和第四(8)?因为1+2+8=11?那么函数应该如何返回多个dict?是否应该将它们包装在一个列表中,如
[字典字母上方,字典字母下方,字典符号]
?如果您将字典重构为使用0-3而不是1-4,那么您可以更轻松地使用位篡改。@guidot所有大写字母都是字符串常量,不dictionaries@Ev.Kounis是的,枚举和组合多个值是一种惯例,想象一下用一个DB而不是存储4个字段true/false您可以用一个字段来管理它,想象一下如果您有多个标志可以是true/false。该系统有助于节省数据库空间,并允许您以任何可能的组合方式组合标志,您只需每隔一个值将该值加倍。1、2、3和4的位操作?这看起来并不像预期的那样工作。如果键是0x1、0x2、0b11、0b100,它会更像工作吗?不,这看起来像是你在故意混淆阅读代码的人。你为什么要把十六进制数和二进制数混在一起?