Есть ли значение «Не важно» для списков в Python - PullRequest
0 голосов
/ 26 ноября 2018

Есть ли способ использовать count(), когда вы ищете конкретное значение во вложенном списке и не заботитесь об остальных?

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

Это вернет счетчик 3, поскольку есть три вложенных списка, в первом индексе которых есть 1.

Есть ли способ сделать это?

Ответы [ 5 ]

0 голосов
/ 27 ноября 2018

Другие показали хорошие способы решения этой проблемы с помощью встроенных 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 для суммы.)

0 голосов
/ 26 ноября 2018

Подсчет того, как часто одно значение встречается в первой позиции, требует полного прохода по списку, поэтому, если вы планируете использовать потенциал 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
0 голосов
/ 26 ноября 2018

Посмотрите на длину отфильтрованного списка:

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)
0 голосов
/ 26 ноября 2018

Вы можете сделать len(filter(lambda x: x[0] == 1, lst))

Но будьте осторожны, если ваш список содержит элемент, который не является списком (или пустым списком), он выдаст исключение!Это может быть обработано добавлением двух дополнительных условий

len(filter(lambda x: type(x) == list and len(x) > 0 and x[0] == 1, lst))

0 голосов
/ 26 ноября 2018

Используйте несколько подлых 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 для каждого элемента в your_list, первый элемент которого равен вашему X.Функция sum() принимает значения и обрабатывает True как 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...