簡體   English   中英

維護凍結集中元素的順序

[英]Maintaining the order of the elements in a frozen set

我有一個元組列表,每個元組包含一個字符串和兩個整數。 該列表如下所示:

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

您可以直接在frozenset setfrozenset ,而只能將其用作輔助數據結構 - 就像在itertools部分unique_everseen配方中一樣(復制逐字):

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

將按原樣返回元素並且還保持元素之間的相對順序。

沒有與frozensets訂購。 您可以改為創建已排序的元組以檢查項目是否存在,如果集合中不存在元組,則添加原始元組:

y = set()
lst = []
for i in x:
    t = tuple(sorted(i, key=str)
    if t not in y:
         y.add(t)
         lst.append(i)
print(lst)
# [('a', 1, 2), ('b', 3, 4), ('x', 5, 6)]

第一個條目被保留。

NumPy中有一些非常有用的功能可以幫助您解決這個問題。

import numpy as np
chrs, indices = np.unique(list(map(lambda x:x[0], x)), return_index=True)
chrs, indices
>> (array(['a', 'b', 'x'], 
   dtype='<U1'), array([0, 1, 2]))
[x[indices[i]] for i in range(indices.size)]
>> [('a', 1, 2), ('b', 3, 4), ('x', 5, 6)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM