如何只使用一个循环打印字符串中的“最少”字符?

时间:2017-02-05 16:22:23

标签: python string loops

我正在尝试在字符串中打印“最少”字符,如果字符比另一个字符更接近字母表的开头,则字符较小,并且它是第一个索引位置。 我应该只使用1个循环来确定字符的索引,并且不允许使用min,max,index,find,ord,chr或lists。 例如:

leastChar("yRrcDefxBqubSlyjYelskd")

应该产生:

The least char is 'B' and occurs at position 8.

目前我有:

def leastChar(inputString):
    lowerString = inputString.lower()
    print(lowerString)
    indexLength = (len(lowerString) - 1)
    print(indexLength)
    index = 0
    for i in range(indexLength):
        if lowerString[i] < lowerString[i+1]:
            index = i
    print("The least char is '{0}' and occurs at position {1}".format(inputString[index], index))

返回:

leastChar("yRrcDefxBqubSlyjYelskd")
yrrcdefxbqubslyjyelskd
21
The least char is 'l' and occurs at position 18

我尝试了多种变体,但即使使用超过1个循环,我发现自己在各个位置都得到了错误的答案。 另外,如果重要的话,至少Char('blAh')将在第2位返回'A',就像它应该的那样。

我认为最接近看似正确的是,当我在初始for循环中放入另一个for循环时希望我可以增加该变量来比较'i',例如:

for i in range(indexLength):
    for j in range(indexLength):
        if lowerString[i] < lowerString[j]:

对此做些什么,但我无法使其发挥作用。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

扩展@ melpomene的评论,算法技巧(或花哨的计算机科学家称之为启发式)是跟踪两者的最小位置和最小值你正在遍历字符串。

def leastChar(inputString):
    # handle cases where inputString is `None` or empty
    if not inputString:
        print('Oh no, inputString is blank!  Run away!')
        return
    lowerString = inputString.lower()
    print(lowerString)
    # use enumerate to keep track of the index as
    # you are iterating over a list
    min_value = lowerString[0]
    min_pos = 1
    for index, ch in enumerate(lowerString, 1):
        # check to see if current char is closer to 
        # front of alphabet than our current minimum
        if ch < min_value:
            # if so, keep track of the current pos/value
            # as the new minimum
            min_pos = index
            min_value = ch
            # pythonic: min_pos, min_value = index, ch
    print("The least char is '{0}' and occurs at position {1}".format(min_value, min_pos))

答案 1 :(得分:0)

有不同的方式:

1)您不允许使用min,max,index,find,ord,chr或list? 我会尝试使用rfind()或rindex()。 :^)

2)复制字符串并使用sort()查找副本中最小的字符。然后你应该使用search()在原始的InputString中返回这个char的位置。

3)创建一个字母串&#34; abcdef ....&#34;并构建一个复杂的while-if-try-except结构来获得结果,但每个人都会讨厌它。 :^)

答案 2 :(得分:-1)

如果我能正确理解你的问题,你可以在python中使用min

>>> min('yRrcDefxBqubSlyjYelskd')
'B'

然后您可以使用index方法:

>>> 'yRrcDefxBqubSlyjYelskd'.index('B')
8

将返回字符串中char的第一次出现。您的代码中的问题是,在迭代时,您正在检查字符是否小于下一个字符,如果是,则保存索引,但不检查索引处的字符是否已经更小。