Python:消除重复的嵌套列表



我正在为自然语言处理构建一个标记模型。最初,句子的单词被标记为词性(如名词的 NN),然后应用规则将它们划分为表示为嵌套列表的树。此过程会多次迭代,直到在顶层获得一个节点。我有一个所有潜在树的主列表,我需要消除重复的树,否则整个事情就会在内存中爆炸。以下是列表组成的一小部分示例。我需要确保列表中的每个列表都是唯一的,因为每次迭代都会创建许多分支。

[[('NP', [('PRP', 'I')]), ('VBD', 'ate'), ('DT', 'a'), ('NN', 'steak'), ('IN', 'with'), ('DT', 'a'), ('NN', 'knife'), ('.', '.')]
[('PRP', 'I'), ('VP', [('VBD', 'ate')]), ('DT', 'a'), ('NN', 'steak'), ('IN', 'with'), ('DT', 'a'), ('NN', 'knife'), ('.', '.')]
[('PRP', 'I'), ('VBD', 'ate'), ('NP', [('DT', 'a')]), ('NN', 'steak'), ('IN', 'with'), ('DT', 'a'), ('NN', 'knife'), ('.', '.')]
...]

我想使用一组,但列表是不可哈希的。我尝试使用递归,但它的内存不足。我想过将列表转换为字符串,使用字符串作为字典键,使用列表作为值,然后迭代并再次将其重新转换为列表(或将其保留为字典?有没有人有不那么黑客的解决方案?我对 Python 比较陌生,所以请解释一下您的解决方案是如何工作的。

我应该澄清一下:嵌套列表可以无限深入。树结构不是事先知道的,而是动态构建的。尝试构建这样的东西 -http://jos.oxfordjournals.org/content/25/4/345/F23.large.jpg 但以嵌套列表的形式。

你可以对元组进行哈希处理。这可能会解决您的一些问题(尽管我对自己的问题有点困惑)这将允许您将所有现有的元组存储在一个集合中(这是一种可哈希列表)。这样,当您尝试创建您刚刚调用的每个新元组时

if my_tuple in my_tuple_set:
    # the best way I could find to access the item in a tuple
    stored_tuple = my_tuple_set.pop(my_tuple) 
    my_tupple_set.add(stored_tuple)
    my_tuple = stored_tuple   # reset pointer to stored data

不得不处理 python 中的内存问题很有趣!

感谢 sdasdadas 指出重复项。我能够通过创建这个函数(或多或少)解决它:

 def list_to_tuple(a_list):
    temp_list = []
    for item in a_list:
        if isinstance(item, list) or isinstance(item, tuple):
            temp_list.append(list_to_tuple(item))
        else:
            temp_list.append(item)
    return tuple(temp_list)

它采用无限深度嵌套列表或元组,并在元组中返回等效的东西。在另一个函数中,我通过一个集合传递它以确保唯一值,然后它可以返回到列表或其他任何内容。

感谢您的回答。

最新更新