📅  最后修改于: 2023-12-03 15:41:38.407000             🧑  作者: Mango
在 Python 中,我们可以使用多种方法计算唯一值。这些方法可以应用于不同的数据类型,具有不同的复杂度和效率。
最简单的方法是将列表转换为集合,并将其转换回列表:
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)可以保留元素的顺序,并帮助我们删除重复的元素:
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() 方法来创建唯一值字典:
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 是一个强大的数据操作库,可以轻松地计算唯一值。如果我们有一个 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() 方法计算唯一值:
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。