【问题标题】:Search for list with element inside list [Python 3]搜索列表中包含元素的列表 [Python 3]
【发布时间】:2015-04-09 20:04:41
【问题描述】:

假设我有列表A,定义为[['foo',1],['bar',2]]。如何在A 中找到包含'foo' 的列表?

【问题讨论】:

  • 好吧,让我们备份一下:如果我们有一个列表,你怎么知道里面是否有一个元素?
  • 如果表达式“if element in list”返回“True”。
  • 好的,那么,如何遍历列表列表以查看最内层是否有内容?
  • 啊,我会使用 for 循环来迭代最外层列表中的每个项目,并应用我以前的方法。谢谢!
  • 对于一个初学者问题,您得到了一些非常复杂的答案——请确保您了解您使用的解决方案。随意使用您选择的最佳解决方案来回答您自己的问题!

标签: python list search python-3.x


【解决方案1】:

使用生成器表达式来测试每个子列表。由于我们只想要第一个,我们可以在 genexp 上使用next() 函数。

A = [['foo', 1], ['bar', 2]]
a = next(x for x in A if "foo" in x)

这给了你子列表本身。如果您想要子列表的索引:

a = next(i for i, x in enumerate(A) if "foo" in x)

请注意,您实际上可能不需要索引。只要拥有列表对象,您就可以做大部分想做的事情。例如,如果您想将子列表完全替换为["baz", 3],您可以对其进行切片赋值:

a = next(x for x in A if "foo" in x)
a[:] = ["baz", 3]

使用任一公式,如果未找到搜索词,您将收到 StopIteration 异常。您可以使用next() 的第二个参数返回None 或其他任何东西。在这种情况下,您必须在 genexp 周围加上括号:

a = next((x for x in A if "foo" in x), None)

【讨论】:

  • a[:] 和 list(a) 之间有什么偏好吗?我一般选择后者
  • = 符号的左侧,a[:] 是切片分配,而不是副本。 list(a) 不能在 = 的左侧工作。对于复制列表,a[:]list(a) 稍快,但在大多数情况下您可能不会注意到。我会说在这种情况下,问题是个人风格问题。任何称职的 Python 程序员都会认出两者都是副本。
【解决方案2】:

为了让事情复杂化,你可以使用filter

>>> a = [['foo',1],['bar',2]]
>>> list(filter(lambda x:'foo'in x , a))
[['foo', 1]]
>>> a = [['foo',1],['bar',2],[1,'foo']]
>>> list(filter(lambda x:'foo'in x , a))
[['foo', 1], [1, 'foo']]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多