读取一个单词并打印所有子串,按Python的长度排序

时间:2016-05-14 15:08:45

标签: python loops for-loop substring

我编写了一个程序来读取一个单词并打印所有子串,按长度排序。例如,如果用户提供输入“朗姆酒”,程序将打印出来  
r      你们      m
     茹
     嗯
     朗姆酒

以下代码是我所做的并设法打印:  
r      你们      m
     茹
     嗯
     m

我不明白的问题,如何让循环打印出从'm'到'rum'的最后一个单词的正确输出..我错过了什么?

如果有人能指出我的代码中纠正我的循环的方式,我真的很感激。非常感谢!

word = input("\nPlease enter a word : ")
length = 1
pos = 0

for i in range(length, len(word)):
    for j in range(pos, len(word)):
        print(word[j:i+j])

4 个答案:

答案 0 :(得分:2)

我只是在每次处理for循环时都使用print()来查看j和i + j是什么。这是问题所在;

word = input("\nPlease enter a word : ")
length = 1
pos = 0

for i in range(length, len(word)):
    for j in range(pos, len(word)):
        print (j)
        print (i+j)
        print(word[j:i+j])
        print ("------------")

输出:

>>> 

Please enter a word : rum
0
1 #word[0:1]
r
------------
1
2 #word[1:2]
u
------------
2
3 #word[2:3]
m
------------
0
2  #word[0:2]
ru
------------
1
3  #word[1:3]
um
------------
2
4 #word[2:4] which is only m.
m
------------
>>>

您的代码尝试在word[2:4]的最后一部分打印m。这就是问题,这就是为什么它只打印m而不是全文。

更好地使用combinations()

from itertools import combinations

word = "rum"
for x in range(len(word)+1):
    for c in combinations(word,x):
        print ("".join(c))

输出:

>>> 
r
u
m
ru
rm
um
rum
>>> 

答案 1 :(得分:1)

试试这个,

def grouper(l, n):
    """get a generator of n consecutive items from a given list 
    """
    # the last element is l[-n:]
    for i in range(len(l)-n+1): 
        yield l[i:i+n]

word = 'abcde'
result = [s for i in range(1, len(word)+1) for s in grouper(word, n=i)]

print(result)
# Output
['a', 'b', 'c', 'd', 'e', 'ab', 'bc', 'cd', 'de', 'abc', 'bcd', 'cde', 'abcd', 'bcde', 'abcde']

这可能有助于理解Python的切片表示法。

 +---+---+---+---+---+
 | a | b | c | d | e |
 +---+---+---+---+---+
   0   1   2   3   4  
  -5  -4  -3  -2  -1

答案 2 :(得分:1)

您的代码中存在两个问题:

  • range返回的列表不包含stop,因此您首次range使用(在外部循环中)应为range(length, len(word)+1)
  • 第二个范围使用意外更大stop,这应该取决于外环的i,我认为是当前长度

这里是更正后的代码:

word = 'rum'
for length in range(1, len(word)+1):
    for pos in range(0, len(word)-length+1):
        print(word[pos:pos+length])

答案 3 :(得分:0)

在这里你走人,使用while循环将解决你的问题。

    word = input("\nPlease enter a word : ")
    j=1
    result = []
    while True:
        for i in range(len(word)-j+1):
            result.append(word[i:i+j])
        if j==len(word):
            break
        j+=1

    for substr in result:
        print(substr)

    # Output
    r
    u
    m
    ru
    um
    rum

此代码偏离过程可以更简洁,但它确实可以完成这项工作。它也是从字符串中获取不同子串的一种非常常见的方法。