我有一个(很长的)名单,这个结构:我如何计算列表中标识元素的数量?
li1 = [[1.4, b][1.5, a][1.6, c][1,4, b][1.7,c][1.4, a][1.6,c]]
我想写一个循环,计算元件的数量,li1[i][0
]`具有相同的价值,并提出在新的列表信息,如这样的:
li2 = [[1.4, 3][1.5, 1][1.6, 2][1.7, 1]]
,我的问题是,我不知道还有什么价值,或者有多少不同的价值观,我在寻找..
谢谢
我有一个(很长的)名单,这个结构:我如何计算列表中标识元素的数量?
li1 = [[1.4, b][1.5, a][1.6, c][1,4, b][1.7,c][1.4, a][1.6,c]]
我想写一个循环,计算元件的数量,li1[i][0
]`具有相同的价值,并提出在新的列表信息,如这样的:
li2 = [[1.4, 3][1.5, 1][1.6, 2][1.7, 1]]
,我的问题是,我不知道还有什么价值,或者有多少不同的价值观,我在寻找..
谢谢
由于您只关心列表的第一个值,因此第一步是从每个子列表中提取它(顺便提一下,它应该是tupels)。
>>> a,b,c = 'abc'
>>> li1 = [[1.4, b], [1.5, a], [1.6, c], [1,4, b], [1.7, c], [1.4, a], [1.6, c]]
>>> firsts = map(lambda sublist: sublist[0], li1)
map
使用第二个参数的元素调用它的第一个参数。由于这里的第一个参数是一个anonymous function (lambda)返回其参数的第一个元素,首创的值现在为这些第一元素的列表:
>>> firsts
[1.4, 1.5, 1.6, 1, 1.7, 1.4, 1.6]
或者,你也可以使用一个list comprehension来写同样的事情以不同的方式:
>>> firsts = [sublist[0] for sublist in li1]
>>> firsts
[1.4, 1.5, 1.6, 1, 1.7, 1.4, 1.6]
地图的结果(在Python 2)和列表解析是存储在内存中的列表。这对我们的小名单li1
没有任何问题,但可以成为大型输入列表中的一个。因为我们只想要一次算值,我们并不真正需要存储它们,因此可以(在时间,这“计算”每个值)使用generator expression:
>>> first = (sublist[0] for sublist in li1)
firsts
现在是一个生成器对象从中我们可以得到第一个值。
现在,进入计数。幸运的是,Python的2.6 +提供了一个Counter
类,我们可以使用:
>>> import collections
>>> counter = collections.Counter(firsts)
>>> counter.most_common()
[(1.4, 2), (1.6, 2), (1.5, 1), (1.7, 1), (1, 1)]
注意,结果表示为tupels,这可能是你想要什么反正。如果你真的需要一个列表(例如,由于要追加东西的元素),使用map
做一个列表出来的每个元组:
>>> map(list, counter.most_common())
[[1.4, 2], [1.6, 2], [1.5, 1], [1.7, 1], [1, 1]]
综上所述,短期办法写这一切:
import collections
a,b,c = 'abc'
li1 = [[1.4, b], [1.5, a], [1.6, c], [1,4, b], [1.7, c], [1.4, a], [1.6, c]]
li2 = collections.Counter(sublist[0] for sublist in li1).most_common()
from collections import Counter
a, b, c = 'abc'
li1 = [[1.4, b], [1.5, a], [1.6, c], [1.4, b], [1.7, c], [1.4, a], [1.6, c]]
sorted(Counter(x[0] for x in li1).items())
(map
list
到这一点,如果你迫切希望列表的列表。)
非常感谢! – user1032444
>>> li1 = [[1.4, 'b'],[1.5, 'a'],[1.6, 'c'],[1.4, 'b'],[1.7,'c'],[1.4, 'a'],[1.6,'c']]
首先,我们创建一个像(1.4,'b')
键和值表示在最初的名单是关键要素的数量词典:
>>> d = {}
>>> for el in li1:
el = el[0]
d[el] = d.get(el,0) + 1
所以,字典是这样的:
>>> d
{1.5: 1, 1.4: 3, 1.7: 1, 1.6: 2}
另外,请注意,使用d.get
。因为最初字典中不包含任何元素,所以当没有元素时(第二个参数为get
),返回0
。还有其他技术可以实现此行为:您可以使用DefalutDict
或Counter
,正如其他答案中所用。
然后我们使用字典创造必要的名单:
>>>[[key,value] for key,value in d.items()]
[[1.5, 1], [1.4, 3], [1.7, 1], [1.6, 2]]
这只是用'类型错误:unhashable类型:“list''并不会接近到什么OP是要求(计重复) 。 – delnan
-1仔细阅读。这仍然不符合OP的要求。它只是完全删除重复的元组,而不是计算重复的第一项。 – delnan
@delnan更新了一个解决方案,它的确包括了一些解决方案,包括一些关于它如何和为什么起作用的解释,并且使用'most_common'而不是'items'来得到按发生次序排序的结果。 – phihag