保持冻结集中元素的顺序

发布于 2021-01-29 16:13:43

我有一个元组列表,每个元组包含一个字符串和两个整数。该列表如下所示:

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
关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    与其直接在setof上进行操作frozenset,不如将其仅用作辅助数据结构-如unique_everseenitertools部分中的配方(逐字复制):

    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)]
    

    将按原样 返回元素 并且还保持元素之间的相对顺序。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看