跟踪已处理的列表

11 浏览
0 Comments

跟踪已处理的列表

我有一个处理列表的工作流程,并在字典中跟踪我已经见过的列表 - 因为当我遇到已经见过的列表时,我可以跳过它。然而,需要注意的是,对于元素不同但顺序不同的两个列表,它们被视为重复。所以以整数列表为例:[3, 1, 5, 6][5, 3, 6, 1]是等价的。\n我一直在这样做:tuple(sorted(L))并将其放入我的字典中。所以对于上面的例子,seen看起来像这样:\nseen = {..., (1, 3, 5, 6): 1, ...}\n这样做的好处是每次我需要处理一个列表时,都可以进行常数时间的查找。然而,问题是为了检查给定的列表是否在seen中,我必须对其进行tuple(sorted(L))操作。而且事实证明,对于大量的数据,这变得不可行,甚至会占据整个流程总时间的50%以上。\n我想以某种方式利用collections.Counter - 因为Counter[3, 1, 5, 6]Counter[5, 3, 6, 1]会被评估为相等。但是Counter对象不能用作字典键。有什么方法可以保持我的字典查找,但不进行上述的排序操作吗?提前谢谢。\n编辑:在看到使用frozenset的建议时,我意识到我遗漏了一个重要的事情,即元素可以重复。所以虽然上面的两个列表比较相等,但[3, 1, 5, 6][3, 3, 1, 5, 6, 6]需要被视为不同。由于frozenset操作会删除重复项,这在这里不是一个选项。

0
0 Comments

问题原因:在处理大量重复的列表时,需要找到一种方法来跟踪已处理的列表。

解决方法:可以使用frozenset或排序后的元组来跟踪已处理的列表。这些方法可能会显著增加执行时间。具体来说,可以使用frozenset(Counter(items))或tuple(sorted(Counter(items).items()))来实现。

例如:

from collections import Counter
# 使用frozenset
frozenset(Counter([3, 3, 1, 5, 6, 6]).items())
# 使用排序后的元组
tuple(sorted(Counter([3, 3, 1, 5, 6, 6]).items()))

需要注意的是,以上方法可能会因为性能问题而不适用于大规模的处理。因此,在处理较大规模的过程中,可能需要优化其他方面的效率。

在处理大量重复的列表时,需要找到一种方法来跟踪已处理的列表。可以使用frozenset或排序后的元组来实现,但这可能会增加执行时间。在处理较大规模的过程中,可能需要优化其他方面的效率。

0
0 Comments

问题的出现原因:

在给定的代码中,需要对多个列表进行处理,并且需要跟踪已处理的列表。然而,由于列表是可变的,无法直接将其用作集合的元素。因此,需要寻找一种解决方法来跟踪已处理的列表。

问题的解决方法:

在给定的代码中,使用了frozenset这个数据类型来解决问题。frozenset是一种不可变的集合类型,可以作为集合的元素。通过将列表转换为frozenset,可以将其用作集合中的元素,并能够进行查找操作。代码中使用了一个名为seen的集合来跟踪已处理的列表。每次处理一个新列表时,先将其转换为frozenset,并检查它是否在seen集合中。如果不在集合中,则将其添加到seen集合中。这样就能够跟踪已处理的列表,并且不会重复添加相同的列表。

通过使用frozenset来代替可变的列表作为集合的元素,解决了无法直接跟踪已处理的列表的问题。而且,由于frozenset是不可变的,可以避免对列表进行排序操作,从而提高了性能。

在给定的代码中,需要跟踪已处理的列表。由于列表是可变的,无法直接将其用作集合的元素。因此,通过使用frozenset来代替可变的列表作为集合的元素,解决了无法直接跟踪已处理的列表的问题。通过将列表转换为frozenset,并将其添加到一个名为seen的集合中,能够跟踪已处理的列表,并且不会重复添加相同的列表。这样可以提高性能,避免对列表进行排序操作。

0