给出清单:
#prepare()
我想在索引[1]处生成一个唯一元素的2D列表及其计数。执行列表a将产生:
a = [["b", "a", 3], ["a", "b", 4], ["y", "a", 2], ["b", "a", "b"]]
我已经写了这段代码:
[["a", 3], ["b", 1]]
...但是,它会生成列表:
[(item[1], sum(x[1].count(item[1]) for x in a)) for item in a]
如果可能的话,我很乐意用一个衬垫解决它:)
答案 0 :(得分:0)
您的代码的问题在于您循环遍历所有子列表并保留整个列表中第二个项目的计数,这肯定会产生相同项目的重复结果。相反,您可以使用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)]
答案 1 :(得分:0)
使用collections.Counter
与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]]
答案 2 :(得分:0)
您可以从代码中获取一组仅提供唯一条目
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])