计算2D lis中索引处的唯一元素数

2024-05-08 16:21:46 发布

您现在位置:Python中文网/ 问答频道 /正文

给定列表:

a = [["b", "a", 3], ["a", "b", 4], ["y", "a", 2], ["b", "a", "b"]]

我想在索引[1]和它们的计数处生成一个惟一元素的2D列表。在列表a上执行将产生:

[["a", 3], ["b", 1]]

我已经写了这么多代码:

[(item[1], sum(x[1].count(item[1]) for x in a)) for item in a]

…但是,它会生成以下列表:

[('a', 3), ('b', 1), ('a', 3), ('a', 3)]

如果可能的话,我想用一行代码来解决:)


Tags: 代码in元素列表forcountitem计数
3条回答

使用^{}generator expression组合,可以获得项目计数:

>>> a = [["b", "a", 3], ["a", "b", 4], ["y", "a", 2], ["b", "a", "b"]]
>>> from collections import Counter
>>> Counter(item[1] for item in a)  # gen-expr to yields 2nd ([1]) items
Counter({'a': 3, 'b': 1})

要以序列列表的形式获取结果,请执行以下操作:

>>> Counter(item[1] for item in a).most_common()
[('a', 3), ('b', 1)]
>>> [list(x) for x in Counter(item[1] for item in a).most_common()]
[['a', 3], ['b', 1]]

你可以从你的代码中得到一个只提供唯一条目的集合

a = [["b", "a", 3], ["a", "b", 4], ["y", "a", 2], ["b", "a", "b"]]
set([(item[1], sum(x[1].count(item[1]) for x in a)) for item in a])

你的代码的问题是,你在所有子列表上循环,并保留整个列表中第二个项目的计数,这肯定会产生相同项目的重复结果。相反,您可以使用zip()函数获取第二列,然后使用collections.Counter计算第二列中的项数:

In [3]: from collections import Counter

In [5]: Counter(zip(*a)[1]).items()
Out[5]: [('a', 3), ('b', 1)]

在python 3.X中:

z = zip(*a)
next(z)
Counter(next(z)).items()
[('a', 3), ('b', 1)]

相关问题 更多 >