有一种方法可以使用count()
在嵌套列表中查找特定值而不关心其余值的地方?
lst = [[1,6],[1,4],[3,4],[1,2]]
X = 1
lst.count([X, _ ])
这将返回3
的计数,因为三个嵌套列表的第一个索引中都带有1
。
有没有办法做到这一点?
答案 0 :(得分:6)
使用一些偷偷摸摸的sum()
骇客:
sum(k[0] == X for k in your_list)
即
>>> X = 1
>>> your_list = [[1,6],[1,4],[3,4],[1,2]]
>>> sum(k[0] == X for k in your_list)
3
为什么?
节:k[0] == X for k in your_list
是一个生成器表达式,它对第一个元素等于您的True
的{{1}}中的每个元素产生your_list
。 X
函数采用这些值并将sum()
视为True
。
答案 1 :(得分:4)
您可以进行len(filter(lambda x: x[0] == 1, lst))
但是要小心,如果您的列表包含的元素不是列表(或空列表),它将引发异常!这可以通过添加两个附加条件来解决
len(filter(lambda x: type(x) == list and len(x) > 0 and x[0] == 1, lst))
答案 2 :(得分:3)
查看过滤列表的长度:
my_list = [[1,6][1,4][3,4][1,2]]
X = 1
len([q for q in my_list if q[0] == X])
或者,如果您更喜欢使用count
,则列出您要做的所关注的项目:
[q[0] for q in my_list].count(X)
答案 3 :(得分:2)
计算一个值在第一个位置出现的频率需要对列表进行完整遍历,因此,如果您打算在同一列表上多次使用潜在的countfunction(inputlist, target)
,则建立字典保存的效率更高您可以随后使用O(1)查询的所有计数(也需要一遍)。
>>> from collections import Counter
>>> from operator import itemgetter
>>>
>>> lst = [[1,6],[1,4],[3,4],[1,2]]
>>> c = Counter(map(itemgetter(0), lst))
>>> c[1]
3
>>> c[3]
1
>>> c[512]
0
答案 4 :(得分:0)
其他人已经展示了使用python内置函数解决此问题的好方法,但是如果您真正想要的是花式索引,则可以使用numpy
。
例如:
import numpy as np
lst = np.array([[1,6],[1,4],[3,4],[1,2]])
print(lst)
#array([[1, 6],
# [1, 4],
# [3, 4],
# [1, 2]])
在这种情况下,lst
是形状为numpy.ndarray
(4行2列)的(4,2)
。如果要计算第一列(索引0)等于X
的行数,可以编写:
X = 1
print((lst[:,0] == X).sum())
#3
第一部分lst[:,0]
表示仅获取第一个索引。
print(lst[:,0])
#[1 1 3 1]
然后您检查其中哪一个等于X
:
print(lst[:,0]==X)
#[ True True False True]
最后将所得数组求和以得到计数。 (总和从bool
到int
进行了隐式转换。)