我是Python的新手,我做了我的搜索,但我找不到我要找的东西.如果有人提出这个问题,我会提前道歉,如果由于我不知道我想要达到的名字而无法找到它.我很乐意阅读您可能建议的任何文件.
我有一份清单清单.例如=> [int,'str']
t = [[0234, 'str_0'],
[1267, 'str_1'],
[2445, 'str_2']]
Run Code Online (Sandbox Code Playgroud)
我想知道是否a str存在于列表t列表之一的索引(1)位置.我可以使用包含2 for或while循环的函数来执行此操作,但我正在寻求的是,如果可能,使用一次迭代来实现此目的.我想学习最短的功能.
for input str('str_3'), I want to get int(2) str_1的str_3在其自己的第一个索引位置的列表的索引,我想得到int(0)
对于str_1234我想得到False,因为它不在任何列表中list t
作为一个新手,我通常会这样做:
for n in range(len(t)):
if t[n][1] == 'str_1'
return n
return False
Run Code Online (Sandbox Code Playgroud)
我想要获得的是,如果可能的话,在一行代码中实现这一目标的更好更短的方法,或者仅仅是为了了解是否有更智能,更好或更多的pythonic方式,你们中的任何一个肯定更多有经验的人会推荐
谢谢
Joh*_*ica 11
[n for n, (i, s) in enumerate(t) if s == 'str_3']
Run Code Online (Sandbox Code Playgroud)
说明:
>>> t = [[100, 'str_1'], [200, 'str_2'], [300, 'str_3']]
# Use enumerate to get each list item along with its index.
>>> list(enumerate(t))
[(0, [100, 'str_1']), (1, [200, 'str_2']), (2, [300, 'str_3'])]
# Use list comprehension syntax to iterate over the enumeration.
>>> [n for n, (i, s) in enumerate(t)]
[0, 1, 2]
# An if condition can be added right inside the list comprehension.
>>> [n for n, (i, s) in enumerate(t) if s == 'str_3']
[2]
>>> [n for n, (i, s) in enumerate(t) if s == 'str_1234']
[]
Run Code Online (Sandbox Code Playgroud)
这将返回所有匹配的索引,因为可能有多个匹配索引.
如果你知道只有一个索引,我可以建议使用dict而不是嵌套列表吗?使用dict,您可以使用非常简单的语法在恒定时间内查找元素,而不必进行迭代.
>>> t = {'str_1': 100, 'str_2': 200, 'str_3': 300}
>>> 'str_3' in t
True
>>> t['str_3']
300
>>> 'str_1234' in t
False
>>> t['str_1234']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'str_1234'
Run Code Online (Sandbox Code Playgroud)
将该any函数与生成器表达式一起使用:
any(el[1] == 'str_1' for el in t)
Run Code Online (Sandbox Code Playgroud)
这样做是遍历t,并为每个el在t我们测试如果它的第二个值等于str_1,就像你的循环.
但它只会这样做,直到它找到一个这个为真的元素,然后停止,返回True.如果它没有找到这样的元素,它将返回False.
相反,如果您不仅想测试它的存在,str_1而且还想知道它的位置,那么最有效的方法是使用像您一样的循环.您可以使用它enumerate来为您提供序列中的索引和值:
for n, el in enumerate(t):
if el[1] == 'str_1'
return n
return False
Run Code Online (Sandbox Code Playgroud)