📜  计算唯一值python(1)

📅  最后修改于: 2023-12-03 15:41:38.407000             🧑  作者: Mango

计算唯一值 Python

在 Python 中,我们可以使用多种方法计算唯一值。这些方法可以应用于不同的数据类型,具有不同的复杂度和效率。

列表中的唯一值
使用 set()

最简单的方法是将列表转换为集合,并将其转换回列表:

lst = [1, 2, 3, 1, 2, 5, 6, 7, 6]
uniq_lst = list(set(lst))
print(uniq_lst)  # [1, 2, 3, 5, 6, 7]

这种方法是最快的,但不能保留原始列表中的顺序。如果我们想要保留顺序,可以使用有序集合。

使用 OrderedDict()

有序字典(OrderedDict)可以保留元素的顺序,并帮助我们删除重复的元素:

from collections import OrderedDict

lst = [1, 2, 3, 1, 2, 5, 6, 7, 6]
uniq_lst = list(OrderedDict.fromkeys(lst))
print(uniq_lst)  # [1, 2, 3, 5, 6, 7]
使用列表推导式

使用列表推导式可以很容易地创建一个从原始列表中删除重复元素的新列表:

lst = [1, 2, 3, 1, 2, 5, 6, 7, 6]
uniq_lst = [elem for idx, elem in enumerate(lst) if elem not in lst[:idx]]
print(uniq_lst)  # [1, 2, 3, 5, 6, 7]

这种方法可以根据需要定制,但通常比其他方法慢一些。

字典中的唯一值
使用 setdefault()

我们可以使用字典的 setdefault() 方法来创建唯一值字典:

dict_lst = [{'name': 'John', 'age': 25},
            {'name': 'Jane', 'age': 22},
            {'name': 'John', 'age': 19},
            {'name': 'Peter', 'age': 20},
            {'name': 'Jane', 'age': 28}]

uniq_dict = {}
for d in dict_lst:
    uniq_dict.setdefault(d['name'], d)

uniq_lst = list(uniq_dict.values())
print(uniq_lst)  
"""
[{'name': 'John', 'age': 25},
 {'name': 'Jane', 'age': 22},
 {'name': 'Peter', 'age': 20}]
"""

在此示例中,我们根据每个字典的“名称”键来创建字典。如果遇到重复的名称,则使用最后一个元素替换它。

使用列表推导式

可以创建一个新的列表,其中包含唯一的字典元素:

dict_lst = [{'name': 'John', 'age': 25},
            {'name': 'Jane', 'age': 22},
            {'name': 'John', 'age': 19},
            {'name': 'Peter', 'age': 20},
            {'name': 'Jane', 'age': 28}]

uniq_lst = [dict(s) for s in set(frozenset(d.items()) for d in dict_lst)]
print(uniq_lst)  
"""
[{'name': 'Peter', 'age': 20},
 {'name': 'John', 'age': 19},
 {'name': 'Jane', 'age': 28}]
"""

在此示例中,我们使用 frozenset() 将每个字典转换为 frozenset 对象。由于 set 对象不能包含可哈希的元素(字典不是可哈希的),因此我们需要使用 frozenset。然后,我们将这些 frozenset 对象添加到另一个 set 对象中,以获得唯一的 frozenset 对象。最后,我们使用 dict() 将这些唯一的 frozenset 对象转换回字典。

使用 Pandas
使用 drop_duplicates()

Pandas 是一个强大的数据操作库,可以轻松地计算唯一值。如果我们有一个 Pandas DataFrame,则可以使用 drop_duplicates() 方法计算唯一值:

import pandas as pd

df = pd.DataFrame({'name': ['John', 'Jane', 'John', 'Peter', 'Jane'],
                   'age': [25, 22, 19, 20, 28]})

uniq_df = df.drop_duplicates()
print(uniq_df)  
"""
   name  age
0  John   25
1  Jane   22
2  John   19
3  Peter  20
4  Jane   28
"""

在此示例中,我们创建一个 DataFrame,并使用 drop_duplicates() 方法计算唯一值,返回一个 DataFrame。

使用 groupby()

还可以使用 groupby() 方法计算唯一值:

import pandas as pd

df = pd.DataFrame({'name': ['John', 'Jane', 'John', 'Peter', 'Jane'],
                   'age': [25, 22, 19, 20, 28]})

uniq_df = df.groupby(['name', 'age']).size().reset_index(name='counts')
print(uniq_df)  
"""
   name  age  counts
0  Jane  22   1
1  Jane  28   1
2  John  19   1
3  John  25   1
4  Peter 20   1
"""

在此示例中,我们使用 groupby() 方法将 DataFrame 按列“名称”和列“年龄”分组,并计算每个分组中的元素数。然后,我们使用 reset_index() 方法将结果转换为 DataFrame。