Python:消除重复的嵌套列表

时间:2013-10-31 21:41:02

标签: python nested-lists unique-values

我正在为自然语言处理构建标记模型。最初,句子的单词被标记为词性(如名词的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,但是以嵌套列表的形式。

2 个答案:

答案 0 :(得分:0)

你可以散列元组。这可能会解决您的一些问题(虽然我对您的问题有点困惑)这会让您将所有现有元组存储在一个集合中(这是一种可清除的列表)。这样当你尝试创建每个新的tupple时,你只需要调用

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中处理内存问题!

答案 1 :(得分:0)

感谢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)

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

感谢您的回答。