【问题标题】:How to get every combination of a string? [duplicate]如何获取字符串的每个组合? [复制]
【发布时间】:2020-04-23 15:13:19
【问题描述】:

例如,如果我有“House”这个词,有没有办法获取它的所有可能版本并将其设置为数组。

它会是什么样子

word = 'House'

函数做了一些事情,输出看起来像:

word = ['HOUSE', 'House, house', 'hoUse']


【问题讨论】:

标签: python string


【解决方案1】:

您可以将0111000011 等二进制组合与itertools.product() 一起使用,以获取带有字符串的每个案例组合。这意味着将 1 设置为大写,将 0 设置为小写。所以01110 -> hOUSe, 00011 -> houSE 等等。

from itertools import product

def get_all_cases(string):
    return [
        "".join(
            letter.upper() if binary == 1 else letter
            for letter, binary in zip(string.lower(), binary_comb)
        )
        for binary_comb in product([0, 1], repeat=len(string))
    ]

输出:

>>> get_all_cases("House")
>>> ['house', 'housE', 'houSe', 'houSE', 'hoUse', 'hoUsE', 'hoUSe', 'hoUSE', 'hOuse', 'hOusE', 'hOuSe', 'hOuSE', 'hOUse', 'hOUsE', 'hOUSe', 'hOUSE', 'House', 'HousE', 'HouSe', 'HouSE', 'HoUse', 'HoUsE', 'HoUSe', 'HoUSE', 'HOuse', 'HOusE', 'HOuSe', 'HOuSE', 'HOUse', 'HOUsE', 'HOUSe', 'HOUSE']

您也可以只映射到 TrueFalse 布尔值,而不是 10

from itertools import product

def get_all_cases(string):
    return [
        "".join(
            letter.upper() if is_upper else letter
            for letter, is_upper in zip(string.lower(), comb)
        )
        for comb in product([False, True], repeat=len(string))
    ]

【讨论】:

  • 请注意:如果字符串很长,则会产生很多组合。
  • @nneonneo 是的,准确地说,2^n 其中 n 是字符串的长度。话虽如此,这是一种稍微复杂的方法。重复问题中演示了更好地使用 itertools.product
  • 在技术上回答问题而忽略真正问题的好例子。
  • @Chris 如果您不喜欢这个答案,请随意投反对票。
  • 就像我说的,它在技术上回答了这个问题。我宁愿让问题被删除。
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 2014-02-04
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多