Как мне просмотреть строки в столбце и посчитать их с помощью Python? - PullRequest
2 голосов
/ 07 октября 2011

Я пытаюсь перебрать столбец в таблице доступа, используя Python.Столбец у меня отсортирован по возрастанию.

Я пытаюсь выполнить цикл по строкам, и когда значение в столбце изменяется, я хочу получить количество всех этих значений.В приведенном ниже столбце примера первой группой значений, которые я хочу подсчитать, являются M1.Когда следующая строка изменится на M21, я хочу посчитать M21, пока она не изменится на M23b и так далее.

Я не хочу использовать оператор if / else, потому что есть несколько сотен возможных значений.Я поиграл с функцией groupby в модуле itertools, но мне не удалось определить синтаксис для работы в моем примере.Я также попробовал глупую петлю, делая что-то вроде if row != row.next(): do_something, но это взорвалось мне в лицо.Если кто-нибудь может предложить обходной путь или показать мне пример сценария, который сделает это для меня, я был бы признателен.

Пример столбца:

M1
M1
M1
M21
M21
M23b
M23b
S2
S23b
S23B
O1
O2
O2
O2

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

Ваша интуиция для использования itertools.groupby была правильной:

for key, group in groupby(column):
    count = sum(1 for item in group) # Thanks JBernardo
    # the key is what is in the column, count is the number of items

В качестве альтернативы, если все, что вам нужно, это подсчет, это так просто, как:

from collections import Counter # Python 2.7+

group_counts = Counter(column)

Вы можете реализовать Counter как:

from collections import defaultdict:

group_counts = defaultdict(int)

for item in column:
    group_counts[item] += 1

на более старых версиях Python.

1 голос
/ 07 октября 2011

Если вы хотите добавить печать в цикле, выполняя другую работу, может быть полезно следующее:

from collections import Counter  # or defaultdict

col_counts = Counter()           # or defaultdict(int)

last_value = object()            # won't show up in table
for row in access_table:
    col_counts[row[field]] += 1
    if row[field] != last_value:
        print(col_counts[last_value])
        last_value = row[field]
    ...
    other_processing()
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...