【问题标题】:Pythonic way to find value in 2D list? [duplicate]在 2D 列表中查找值的 Pythonic 方法? [复制]
【发布时间】:2020-06-27 21:04:31
【问题描述】:

使用 numpy 数组,您可以通过切片检查特定列,即array[:, 0]。 对于列表,检查 2D 元素是否在里面就像["one", "two"] in some_list 一样简单。但是,仅查看 "one" 是否存在就需要遍历元素,即 ["one" == item[0] for item in some_list]。

我更喜欢 numpy 数组,除了我的数组需要修改(在末尾添加和删除值)。我喜欢使用列表,因为它们非常易于使用。我正在考虑使用数据框,但我觉得我应该能够找到一些巧妙而有效的方法来使用列表进行这种操作。

【问题讨论】:

  • 你能添加一个二维列表的例子和你正在寻找的值吗?您的示例谈到寻找“2D 元素”,然后显示一维列表 (["one", "two"]),目前尚不清楚较大的 some_list 是什么样的。
  • 您是否只是想测试给定目标是否存在于二维列表中?
  • 我认为这是你可以用列表做的最好的事情。如果您需要经常执行检查以查看二维列表中是否存在某个值,那么维护一个包含您插入的所有值的字典可能是值得的。如果这样的搜索很少见,那么我想这是最好的列表。
  • 没有更有效的方法...数组和列表都需要线性搜索这种东西。除非您的数据已排序。
  • 数组的维度是多少?

标签: python python-3.x list


【解决方案1】:

要检查item是否存在于二维列表list_of_lists中的任何位置,您可以这样做

any(item in sublist for sublist in list_of_lists)

注意,与另一个答案的列表展平想法不同,此解决方案不需要使用任何额外的内存。

【讨论】:

    【解决方案2】:

    不确定这是否是您要问的,但如果您只想知道某个元素是否存在于列表列表中l,您可以展平l 并使用运算符in,如下所示:

    >> l = [["one", "two"], ["three", "four"]]
    >> one_is_in_l = "one" in [item for sublist in l for item in sublist]
    >> print(one_is_in_l)
    True
    

    您也可以使用 numpy 来进行检查:

    >> l = [["one", "two"], ["three", "four"]
    >> one_is_in_l = "one" in np.array(l)
    >> print(one_is_in_l)
    True
    

    【讨论】:

    • 或者我可以将我的 numpy 数组转换为具有额外/更少值的新数组,这听起来非常低效...您的第一个解决方案等同于我的: any(["one" == item[ 0] 用于 some_list 中的项目])
    • 它是等价的,但使用运算符“in”应该比手动迭代更有效。您可以做的另一件事是创建一个新的列表列表,其中包含要添加到原始列表中的元素,以跟踪其预期索引。在该过程结束时,您可以使用 numpy 组装新矩阵。
    • 请注意,这是非常低效的。即使第一个元素满足条件,它也会创建整个展平列表。
    • 它是低效的,尽管它很短,如果它不在整个代码的关键路径中也没关系。或许穆德可以提供更多背景信息?
    猜你喜欢
    • 2012-01-10
    • 2022-06-23
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多