我的名单是L = [[1,1], [2,2], [1,1], 1]
我想在n中计算L中不同的元素。怎么样???计数后答案应为3。
这是一种方式。诀窍是将iterables转换为可散列类型(例如元组)。然后你可以转换为set
并计算len
。
当然,这不会做的是区分列表中的列表元素和元组元素。但这可能不适用于您的用例。
from collections import Iterable
L = [[1,1], [2,2], [1,1], 1]
len(set(tuple(i) if isinstance(i, Iterable) else i for i in L))
# 3
如果项目在其班级中至少可排序,则可以使用以下方法查找unqiues。由于Python3主要不允许跨类型比较,我们先按类型排序,然后按值排序:
>>> from operator import itemgetter as item_, attrgetter as attr_
>>> from itertools import groupby
>>>
>>> by_type = groupby(sorted(zip(map(attr_('__qualname__'), map(type, L)), L)), item_(0))
>>> by_type = {k: list(map(item_(0), groupby(map(item_(1), g)))) for k, g in by_type}
>>> by_type
{'int': [1], 'list': [[1, 1], [2, 2]]}
# total number of uniques
>>> sum(map(len, by_type.values()))
3
对于那些不喜欢map
的人来说,这是一个使用理解的翻译:
>>> by_type = groupby(sorted((type(i).__qualname__, i) for i in L), item_(0))
>>> by_type = {k: [gk for gk, gg in groupby(gval for gtp, gval in g)] for k, g in by_type}
>>> by_type
{'int': [1], 'list': [[1, 1], [2, 2]]}
首先将列表的每个元素字符串化
然后找到一组字符串化元素
然后得到集的长度
print(len(set([str(i) for i in L])))
>>> 3
另外......你的OP请求“numpy”,这是不可能的,因为你不能在一个数组(列表和整数)中有多种数据类型。
和:
来自评论,好看的Paul Panzer;这应该修复问题,同时保持简洁的一个班轮:
L1 = [[0], np.array([0])]
print (len(set([(str(i)+str(type(i))) for i in L1])))
>>> 2
L2 = [[0, 1], np.array([0, 1])]
print (len(set([(str(i)+str(type(i))) for i in L2])))
>>> 2