Python中的列表是否有无关紧要的值

时间:2018-11-26 20:45:53

标签: python list

有一种方法可以使用count()在嵌套列表中查找特定值而不关心其余值的地方?

lst = [[1,6],[1,4],[3,4],[1,2]]
X = 1
lst.count([X, _ ])

这将返回3的计数,因为三个嵌套列表的第一个索引中都带有1

有没有办法做到这一点?

5 个答案:

答案 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_listX函数采用这些值并将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]

最后将所得数组求和以得到计数。 (总和从boolint进行了隐式转换。)