代码之家  ›  专栏  ›  技术社区  ›  Sreeram TP

使用列表理解将字符串拆分为k个子字符串

  •  1
  • Sreeram TP  · 技术社区  · 6 年前

    我有一根这样的长绳子

    s = 'abcdabcdabcdabcdabcdefghi'

    我想将其拆分为k个子字符串,其中每个子字符串的长度必须至少为1 Ie非空。我想要所有可能的组合。

    我期望的输出必须如下 K 是3

    [['abcda', 'bcdabcdabcda', 'bcdefghi'], [.....], [....], ... ]
    

    我想用清单理解来做这个,但是我被卡住了。是否可以实施?还有其他更快的选择吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   falsetru    6 年前

    使用 itertools.combinations ,您可以获得分离索引对:

    >>> s = 'abcdef'
    >>> k = 3
    >>> list(combinations(range(1, len(s)), k-1))
    [(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]
    

    使用该索引对获取字符串切片

    • (1, 2) -gt; s[:1] , s[1:2] , s[2:] )
    • (1, 3) -gt; S[(1)] , s[1:3] , s[3:] )
    • (4, 5) -gt; s[:4] , s[4:5] , s[5:] )

    >>> from itertools import combinations
    >>> s = 'abcdef'
    
    >>> k = 3
    >>> [[s[i:j] for i, j in zip((None,) + idxs, idxs + (None,))]
    ...  for idxs in combinations(range(1, len(s)), k-1)]
    [['a', 'b', 'cdef'], ['a', 'bc', 'def'], ..., ['abcd', 'e', 'f']]
    
    
    >>> k = 4
    >>> [[s[i:j] for i, j in zip((None,) + idxs, idxs + (None,))]
    ...  for idxs in combinations(range(1, len(s)), k-1)]
    [['a', 'b', 'c', 'def'], ['a', 'b', 'cd', 'ef'], ..., ['abc', 'd', 'e', 'f']]
    
    • s[:1] == s[0:1] == s[None:1]
    • s[2:] == s[2:len(s)] == s[2:None]
        2
  •  0
  •   Filip Młynarski    6 年前

    您可以找到列表中的所有切片,这样如果没有这样的扩展库,任何切片零件都不会是空的:

    s = 'abcd'
    substrings = []
    
    # find slice of first part - from a|bcd to ab|cd
    for first_slice in range(len(s)-2):
        # find slice of second and last part, for bcd - from b|cd to bc|d
        #                                     for cd -  just c|d
        for second_slice in range(first_slice+1, len(s)-1):
            substrings.append([s[:first_slice+1], s[first_slice+1: second_slice+1], s[second_slice+1:]])
    
    print(substrings) # -> [['a', 'b', 'cd'], ['a', 'bc', 'd'], ['ab', 'c', 'd']]
    
    s = 'abcdabcdabcdabcdabcdefghi'
    print(len(substrings)) # -> 276