首页 > 解决方案 > 有没有办法通过访问字典来生成字符串字符的组合列表?

问题描述

key_map = {'1':“'-”,'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno ','7':'pqrs','8':'tuv','9':'wxyz'}

生成可以从开始按键生成的所有 3 字符前缀的列表。

pt = PText() pt.add('234') [pt.possible_prefixes() 中前缀的前缀]

    ['adg', 'adh', 'adi', 'aeg', 'aeh', 'aei', 'afg', 'afh', 'afi', 'bdg', 'bdh', 'bdi', 'beg', 'beh', 'bei', 'bfg', 'bfh', 'bfi', 'cdg', 'cdh', 'cdi', 'ceg', 'ceh', 'cei', 'cfg', 'cfh', 'cfi']

标签: pythonlistloopsdictionary

解决方案


尽管起初我在阅读您的问题时遇到了一些麻烦,但我相信您正在寻找一个函数,该函数将获取包含字典键的字符串并从这些键下的字符串中查找所有字符组合。

虽然我们可以使用 for 循环或列表推导来自己实现这一点,但您正在寻找的是笛卡尔积的一种形式。Python 的标准库已经可以做到这一点,使用itertools.product. 它将任意数量的可迭代对象作为参数,并返回从这些可迭代对象中获取的单个元素的所有组合。

因此,你possible_prefixes(keys)可能看起来像

import itertools
def possible_prefixes(keys):
    return ["".join(res) for res in itertools.product(*(key_map[key] for key in keys))]

*()是一个生成器推导,它将每个键转换为其对应的值,然后对其进行扩展,以便每个条目都是 的单独参数itertools.product。因此,如果我们填写keys = '234'它,它将扩展为itertools.product('abc', 'def', ghi'),这会给出所需的结果。这"".join(res) for res in是我们需要的列表推导,因为itertools.product实际上返回元组,并且您需要一个字符串列表。


推荐阅读