Считать одинаковые элементы на первой позиции во вложенных списках - PullRequest
0 голосов
/ 20 октября 2018

4 задания запланированы на 3 компьютерах с использованием вложенных списков [machine #, job #]

schedule = [[1, 0], [2, 1], [3, 2], [3, 3]]

Я хочу подсчитать, как часто используется машина 3.

Я пытался использовать schedule.count(3) но я не получил никакого вывода, и я думаю, что он все равно проверит все элементы.

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

schedule.count(3) подсчитывает, сколько элементов в schedule равно 3.Вы можете легко увидеть, что ни один из них не является.В конце концов, элементы являются списками.

Тем не менее, вы можете использовать sum с соответствующим выражением генератора:

sum(x[0] == 3 for x in schedule)
# 2

Это более эффективно, чем сборкаlist и вызов len.Суммирование использует тот факт, что bool является подтипом int.

0 голосов
/ 20 октября 2018

Чтобы использовать счетчик, вам нужно создать список машин (путем извлечения каждой машины из списка пар) и подсчитать число экземпляров 3, например, что-то вроде этого:

schedule = [[1, 0], [2, 1], [3, 2], [3, 3]]
lst_count = [ma for ma, _ in schedule].count(3)  # using list and count

ВышеПодход неэффективен, потому что он создает список, и применяет рассчитывать на него.Более эффективный подход заключается в использовании выражения генератора, как предложено @schwobaseggl, одна альтернатива предлагаемому генератору заключается в следующем:

schedule = [[1, 0], [2, 1], [3, 2], [3, 3]]
gen_count = sum(1 for ma, _ in schedule if ma == 3)  # using a generator

Наконец, оба подхода работают нормально, если вы собираетесь считать только экземпляры одного компьютера., если вы хотите, чтобы экземпляры нескольких машин, например, 1 и 3, я предлагаю вам использовать Counter :

from collections import Counter

schedule = [[1, 0], [2, 1], [3, 2], [3, 3]]
counts = Counter(ma for ma, _ in schedule)  # using Counter
print(counts[3])
print(counts[1])

Output

2
1

Обновление

Помимо вышеупомянутых подходов, вы можете использовать простой цикл for и переменную счетчика:

schedule = [[1, 0], [2, 1], [3, 2], [3, 3]]

counter = 0
for ma, _ in schedule:
    if ma == 3:
        counter += 1
print(counter)  # 2

Примечание

Запись ma, _ = x называется распаковкой.Когда вы пишете ma, _, Python ожидает, что каждый элемент списка schedule представляет собой пару элементов.Например, x, y = [1, 2] присваивает значение 1 x и значение 2 y.Использование _ просто означает игнорирование второго значения.

Далее

  1. http://treyhunner.com/2018/03/tuple-unpacking-improves-python-code-readability/
0 голосов
/ 20 октября 2018

Вы можете использовать понимание списка, чтобы извлечь задания на компьютере № 3, а затем просто проверить его длину:

num_jobs = len([x for x in schedule if x[0] == 3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...