在一个元组列表中查找某个元组的索引

5
我有一个元组列表,如果元组包含一个变量,我想找到该元组的索引。以下是我目前所拥有的简单代码:
items = [('show_scllo1', '100'), ('show_scllo2', '200')]
s = 'show_scllo1'
indx = items.index([tupl for tupl in items if tupl[0] == s])
print(indx)

然而,我遇到了以下错误:
indx = items.index([tupl for tupl in items if tupl[0] == s])
ValueError: list.index(x): x not in list

我做错了什么?
4个回答

5
以下内容将返回第一个项目为s的元组的索引。
indices = [i for i, tupl in enumerate(items) if tupl[0] == s]

嘿,伙计们,也许我没有解释清楚。我知道元组列表中的元组是唯一的(它们不会重复)。这就是为什么我只需要该元组的索引,因为我将对其进行某些操作,即indx = indx +1。但现在indx是一个列表,而不是一个简单的整数。所以,我只需要索引而不是索引列表。 - user3578925
@user3578925 我很惊讶您无法弄清如何从索引列表转到所需的单个索引... - donkopotamus
你得到了一个 list,因为我们假设你可能期望有多个匹配项。如果你知道只会有一个匹配项,那么就不需要使用推导式了。 - TigerhawkT3
@donkopotamus 我知道这些对你来说可能很明显,但对我来说并不是,因为我对Python非常不熟悉,特别是涉及到列表、元组和列表推导式的部分。到目前为止,我只处理过Fortran :-) 所以你们能告诉我如何在没有列表推导式的情况下获取索引吗? - user3578925
也许我应该进一步澄清。我只知道元组中的第一个元素和第二个元素可以是任何东西。因此,我正在尝试找到第一个元素为“show_scllo1”的元组的索引。 - user3578925
@TigerhawkT3,我还在等待你们是否知道我的问题的答案。非常感谢你们的帮助。 - user3578925

2

看起来你想要值,所以你正在请求索引。

你可以使用next搜索列表中下一个匹配的值:

>>> items = [('show_scllo1', '100'), ('show_scllo2', '200')]

>>> next(number for (name, number) in items
...      if name == 'show_scllo1')
'100'

所以你实际上根本不需要索引。

1
你正在检查 items 中是否存在一个列表 list,但是它并不包含一个列表 list。相反,你应该创建一个包含每个感兴趣项所在索引的列表 list
indx = [items.index(tupl) for tupl in items if tupl[0] == s]

1
巴,你可以比那个好T.H. (+1同样表明OP方式的错误) - Joran Beasley
1
enumerate() 很可能是 OP 想要的,但从技术上讲,这些解决方案可能会产生不同的行为(对于具有重复元素的 list),因此我选择以不影响算法的方式来解释问题。 - TigerhawkT3

1
index = next((i for i,v in enumerate(my_tuple_of_tuple) if v[0] == s),-1)

这可能是你应该这样做的方式。

@TigerhawkT3,你的建议是可行的,但它返回带有方括号的索引,即[0]。我该如何只获取数字? - user3578925
1
@user3578925 - 它在括号中是因为它是所有匹配索引的“列表”。这次恰好只包含一个匹配项。 - TigerhawkT3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接