Python嵌套列表和迭代

Phi*_*hil 7 python python-2.7

我是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)


Mar*_*ers 7

将该any函数与生成器表达式一起使用:

any(el[1] == 'str_1' for el in t)
Run Code Online (Sandbox Code Playgroud)

这样做是遍历t,并为每个elt我们测试如果它的第二个值等于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)