保持冻结集中元素的顺序
我有一个元组列表,每个元组包含一个字符串和两个整数。该列表如下所示:
x = [('a',1,2), ('b',3,4), ('x',5,6), ('a',2,1)]
该列表包含数千个这样的元组。现在,如果我想获得唯一的组合,则可以frozenset
按以下步骤进行操作:
y = set(map(frozenset, x))
这给了我以下结果:
{frozenset({'a', 2, 1}), frozenset({'x', 5, 6}), frozenset({3, 'b', 4})}
我知道set是 无序的 数据结构,这是正常情况,但是我想在这里保留元素的顺序,以便以后可以将元素插入pandas
数据帧中。数据框将如下所示:
Name Marks1 Marks2
0 a 1 2
1 b 3 4
2 x 5 6
-
与其直接在
set
of上进行操作frozenset
,不如将其仅用作辅助数据结构-如unique_everseen
itertools部分中的配方(逐字复制):from itertools import filterfalse def unique_everseen(iterable, key=None): "List unique elements, preserving order. Remember all elements ever seen." # unique_everseen('AAAABBBCCDAABBB') --> A B C D # unique_everseen('ABBCcAD', str.lower) --> A B C D seen = set() seen_add = seen.add if key is None: for element in filterfalse(seen.__contains__, iterable): seen_add(element) yield element else: for element in iterable: k = key(element) if k not in seen: seen_add(k) yield element
基本上,这将解决您使用时的问题
key=frozenset
:>>> x = [('a',1,2), ('b',3,4), ('x',5,6), ('a',2,1)] >>> list(unique_everseen(x, key=frozenset)) [('a', 1, 2), ('b', 3, 4), ('x', 5, 6)]
这 将按原样 返回元素 , 并且还保持元素之间的相对顺序。