【问题标题】:Find all substring in a string in Python, how can I make it better?在Python中查找字符串中的所有子字符串,我怎样才能让它变得更好?
【发布时间】:2020-04-08 02:05:30
【问题描述】:

我怎样才能让它变得更好?有没有什么算法/方法可以让它变得更好更短?

def sub_string_finder(string):
    given_string = string.upper()
    substring_of = []
    length = len(given_string)
    # find all substring and put it in substring array
    for i in range(length):
        for j in range(i + 1, length + 1):
            substring_of.append(given_string[i:j])
    return substring_of


s = input("Enter a string: ")
print(f"Number of substring: {len(sub_string_finder(s))}")
print(sub_string_finder(s))

“开发者”的输出:

Number of substring: 45
['D', 'DE', 'DEV', 'DEVE', 'DEVEL', 'DEVELO', 'DEVELOP', 'DEVELOPE', 'DEVELOPER', 'E', 'EV', 'EVE', 'EVEL', 'EVELO', 'EVELOP', 'EVELOPE', 'EVELOPER', 'V', 'VE', 'VEL', 'VELO', 'VELOP', 'VELOPE', 'VELOPER', 'E', 'EL', 'ELO', 'ELOP', 'ELOPE', 'ELOPER', 'L', 'LO', 'LOP', 'LOPE', 'LOPER', 'O', 'OP', 'OPE', 'OPER', 'P', 'PE', 'PER', 'E', 'ER', 'R']

Update

这是迄今为止使用itertoolscombinations 的最终答案,感谢受访者。为了提高可读性,我们可以使用换行符。请记住括号和大括号之间的Python allows line breaks

from itertools import combinations


def sub_string_finder(string):
    substring_of = [
    string.upper()[i:j] 
    for i, j in combinations(range(len(string) + 1), r=2)
]
    return substring_of

如果你有兴趣了解 Python 列表理解,可以查看this

【问题讨论】:

  • 至于算法本身,您可能会阅读stackoverflow.com/questions/2560262/…,但请注意这是关于有点不同的任务(查找字符串的所有 unique 子字符串)
  • 输入aaaa的输出应该是什么?
  • 输入 == "aaaa", 输出 == ['A', 'AA', 'AAA', 'AAAA', 'A', 'AA', 'AAA', 'A' , 'AA', 'A']

标签: python python-3.x string algorithm substring


【解决方案1】:

根据@Guy 的建议稍微短一点(没有 itertools):

def sub_string_finder(string):
    substring_of = [string.upper()[i:j] for i in range(len(string)) for j in range(i + 1, len(string) + 1)]
    return substring_of

【讨论】:

    【解决方案2】:

    您可以将嵌套循环写成一行。如果您从i + 1开始第二个内部,您也可以跳过检查!= ""

    def sub_string_finder(string):
        given_string = string.upper()
        length = len(given_string)
        substring_of = [given_string[i:j] for i in range(length) for j in range(i + 1, length + 1)]
    
        return substring_of
    

    或者使用来自itertoolscombinations

    substring_of = [given_string[i:j] for i, j in combinations(range(len(given_string) + 1), r=2) if given_string[i:j] != ""]
    

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多