【问题标题】:Efficient way to remove a list of strings from a 2D array (list of lists) in Python?在Python中从二维数组(列表列表)中删除字符串列表的有效方法?
【发布时间】:2021-12-24 13:38:14
【问题描述】:

我有一个相当大的列表形式的数据集。基本上,这些列表列表是标记化的句子(每一行是一个句子,每个句子都被标记化)。

train_dataset - 二维数组(或列表列表)包含大约 150000 个句子/行,每个句子大约包含 12 到 15 个单词。

td - 另一个一维列表包含 55000 个唯一词。如果这些单词中的任何单词出现在 2D 数组中,我需要将它们替换为 .

我尝试了以下方法,但它们需要很长时间,即使在 Google Colab 的不同运行时环境中也是如此:

train_dataset = ['<UNK>' if train_dataset[i][j] in td else train_dataset[i][j] for i in range(0,len(train_dataset)) for j in range(0,len(train_dataset[i])) ]
train_dataset 

我也尝试将列表转换为 NUMPY 数组并尝试这样做。还是没有运气。

import numpy as np
np_tr = np.array(train_dataset)
for st in td:
  for i in range(0,len(np_tr)):
    for j in range(0,len(np_tr[i])):
      if np_tr[i][j] == st:
        np_tr[i][j] = '<UNK>'

我想知道在 Python 中是否有任何有效的方法可以做到这一点。我无权访问 PySpark 或 Hadoop 来实现这一点。

提前致谢!

【问题讨论】:

    标签: python list multidimensional-array


    【解决方案1】:

    尝试将一维列表转换为set。这应该查找O(1) 而不是O(len(td))。然后你应该能够做你以前做的事情,而且我认为它应该快一点。请记住,您所做的实际上是将 2D 列表展平为 1D 列表。我不确定这是否是你想要的。

    td = set(td)
    train_dataset = ['<UNK>' if train_dataset[i][j] in td else train_dataset[i][j] for i in range(0,len(train_dataset)) for j in range(0,len(train_dataset[i]))]
    train_dataset
    

    【讨论】:

    • 一维列表具有唯一的单词列表,即列表长度 = 集合长度。
    • 我不确定你是否理解列表和集合之间的区别。检查某物是否在集合中是一个恒定时间操作。检查列表中是否有内容是线性操作,因为您必须扫描列表。这有很大的不同。
    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2018-11-20
    • 2023-03-27
    • 2016-07-13
    相关资源
    最近更新 更多