索引函数给了我重复的响应

Index function is giving me duplicate responses

提问人:Wilziam 提问时间:11/7/2023 最后编辑:XMehdi01Wilziam 更新时间:11/7/2023 访问量:81

问:

def capital_indexes():
    val = []
    pos = []
    x = input("Enter a value\n>>")
    for i in x:
        val.append(i)
    for i in val:
        if i.isupper():
            pos.append(val.index(i))
    print(pos)
capital_indexes()

在我上面的代码中,如果我要输入说“HHellO”,那么我会得到输出。我的目标是获得每个大写字母的索引,这将是 .[0, 0, 5][0, 1, 5]

python list for 循环 索引

评论

1赞 cottontail 11/7/2023
为此,您需要从上一次迭代中中断的位置开始索引搜索,例如 .本答案涵盖此类情况。idx = val.index(i, idx+1)
0赞 John Gordon 11/7/2023
index()返回 FIRST 匹配项的索引。因此,在上面的示例中,它两次都找到了第一个 H。

答:

1赞 JRiggles 11/7/2023 #1

您可以通过列表理解轻松完成此操作enumerate

str_in = input("Enter a value\n>>")  # get string from user ('HHellO')
# iterate over the string, adding the index of each uppercase char to the list
indices = [index for index, char in enumerate(str_in) if char.isupper()]
print(indices)
# => [0, 1, 5]
1赞 Timur Shtatland 11/7/2023 #2

使用列表推导式而不是多个循环。它更高效,更易于阅读,更像pythonic:

my_str = "HHellO"
capital_letter_idxs = [i for i, c in enumerate(my_str) if c.isupper()]
print(capital_letter_idxs)
# [0, 1, 5]
0赞 XMehdi01 11/7/2023 #3

若要获取每个大写字母的索引,可以使用循环并跟踪当前索引。for

更新代码:

def capital_indexes():
    val = []
    pos = []
    x = input("Enter a value\n>>")
    for i in x:
        val.append(i)
    for i, char in enumerate(val):
        if char.isupper():
            pos.append(i)
    print(pos)
capital_indexes()
#input ==> HHellO
#output ==> [0, 1, 5]
0赞 hoftherose 11/7/2023 #4

你不能用索引来做到这一点,因为它给你提供了第一次出现的索引。在文档下方。

返回 S 中找到子字符串 sub 的最低索引,使得 sub 包含在 S[start:end] 中。可选参数 start 和 end 被解释为切片表示法。

你可以通过跟踪你所处的数组步骤来做到这一点。要么使用计数器

step = 0
for i in val:
    if i.isupper():
        pos.append(step)
    step += 1

你也可以使用枚举,它会给你两个值,而不仅仅是 i

for step, i in enumerate(val):
    if i.isupper():
        pos.append(step)
0赞 Reilas 11/7/2023 #5

'...在我上面的代码中,如果我输入说“HHellO”,那么我会得到输出 [0, 0, 5]。...'

发生这种情况的原因是您使用的是 index 方法。
这将返回第一个值的索引

请改用 enumerate 内置函数。

s = 'HHellO'
a = []
for i, c in enumerate(s):
    if c.isupper(): a.append(i)

或者,使用列表推导式。

s = 'HHellO'
a = [i for i, c in enumerate(s) if c.isupper()]