如何在List中计数。列表在Python中混合使用

问题描述 投票:1回答:3

我的名单是L = [[1,1], [2,2], [1,1], 1]

我想在n中计算L中不同的元素。怎么样???计数后答案应为3。

python list numpy
3个回答
0
投票

这是一种方式。诀窍是将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

0
投票

如果项目在其班级中至少可排序,则可以使用以下方法查找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]]}

0
投票

首先将列表的每个元素字符串化

然后找到一组字符串化元素

然后得到集的长度

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
© www.soinside.com 2019 - 2024. All rights reserved.