2017-01-02 59 views
0

试图了解为什么我的代码返回的后续实例重复大写字母的第一个位置的有序列表说资本:的Python:返回一个包含索引

任务: 返回包含资本的指标的有序列表在给定的字符串

我的代码:

def capitals(word): 
    cap = [] 
    for i in word: 
     if i.isupper(): 
      cap.append(word.index(i)) 
    return cap 

输出:

[1, 6, 9, 12, 13, 9]应该等于[1, 6, 9, 12, 13, 14]

+0

因为这就是'索引'的作用。 https://docs.python.org/2/tutorial/datastructures.html –

+0

我猜索引13和14有相同的字母? – 2017-01-02 15:48:11

+2

'word.index'只返回第一个匹配的索引。如果单词中有多个相同的字符,它总是返回第一个。 – czheo

回答

1

你的功能可以简化为:

def capitals(word): 
    return sorted([ 
     index for index, letter in enumerate(word) if letter.isupper() 
    ]) 
0

这是解释为什么你的方法是行不通的,它是如何被固定: 你可以给一个第二个参数index:一暗示从哪里开始(我将当前位置作为提示);否则,第一次出现将返回:

def capitals(word): 
    cap = [] 
    for i, letter in enumerate(word): 
     if letter.isupper(): 
      cap.append(word.index(letter, i)) 
    return cap 

和更紧凑和Python的版本:

def capitals(word): 
    return [i for i, letter in enumerate(word) if letter.isupper()] 
5

通过

capitals = lambda word: [i for i,val in enumerate(word) if val.isupper()] 

...然后这可能实际上简化它也适用于相邻的相等字母:

capitals("ThiSiSaTeSTT") 
> [0, 3, 5, 7, 9, 10, 11] 
+0

为什么给一个名称分配一个lambda而不是只写一个正常的函数定义? – wwii

+0

因为它看起来很酷......没有真正的......在制作中,我会将它写入常规函数中,但我认为每个人都在答案部分这样做。 – 2017-01-02 18:56:01

相关问题