от
Я не смог найти понятного объяснения как на самом деле использовать функцию в Python
itertools.groupby()
. Что я пытаюсь сделать, это: Взять список - в этом случае, дети элемента опред
lxml
Разделить его на группы на основе определенных критериев Потом пройдемся по каждой из этих групп отдельно. Я просмотрел документацию, и примеры, но у меня были проблемы, пытаясь применить их за пределы простой список чисел. Итак, как я могу использовать
itertools.groupby()
? Есть ли другой способ я должен быть с использованием? Указатели на хорошие "предпосылки" чтения также будут оценены.

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

13 Ответы

0 голосов
от
Я не смог найти понятного объяснения как на самом деле использовать функцию в Python
itertools.groupby()
. Что я пытаюсь сделать, это: Взять список - в этом случае, дети элемента опред
lxml
Разделить его на группы на основе определенных критериев Потом пройдемся по каждой из этих групп отдельно. Я просмотрел документацию, и примеры, но у меня были проблемы, пытаясь применить их за пределы простой список чисел. Итак, как я могу использовать
itertools.groupby()
? Есть ли другой способ я должен быть с использованием? Указатели на хорошие "предпосылки" чтения также будут оценены.
0 голосов
от
Важное примечание: вы должны сначала выполнить сортировку данных. Часть я не нашел, что в пример строительство
groups = []
uniquekeys = []
for k, g in groupby(data, keyfunc):
   groups.append(list(g))    # Store group iterator as a list
   uniquekeys.append(k)
k
текущая группировка ключевых, и
g
является итератор, который можно использовать для итерации по группе определено, что группировка ключевых. Другими словами, сам
groupby
итератор возвращает итераторы. Вот пример, что используя более четкие имена переменных:
from itertools import groupby

things = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]

for key, group in groupby(things, lambda x: x[0]):
    for thing in group:
        print "A %s is a %s." % (thing[1], key)
    print " "
Это даст вам выход: Медведь-это животное. Утка это животное. Кактус-это растение. Скоростная моторная лодка является транспортным средством. Школьный автобус-это транспортное средство. В этом примере,
things
-это список кортежей, где первый элемент каждого кортежа-это группа, второй элемент принадлежит. Функция
groupby()
принимает два аргумента: (1) данные для группы и (2) Функция, чтобы сгруппировать. Здесь,
lambda x: x[0]
говорит
groupby()
использовать первый элемент каждого кортежа в качестве ключа группировки. В приведенном выше заявлении
for
,
groupby
возвращает три (ключ, группа итератора) пар - один раз для каждого уникального ключа. Вы можете использовать возвращенный итератор для перебора каждого элемента в этой группе. А вот немного другой пример с теми же данными, используя список осмысления:
for key, group in groupby(things, lambda x: x[0]):
    listOfThings = " and ".join([thing[1] for thing in group])
    print key   "s:  "   listOfThings   "."
Это даст вам выход: животные: медведь и утка. растения: кактус. транспорт: скоростной катер и школьный автобус.
0 голосов
от
Можете ли вы показать нам свой код? Пример на языке Python Docs является довольно простым:
groups = []
uniquekeys = []
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)
Так что в вашем случае данные представляют собой список узлов, keyfunc где логика ваша функция критериям идет и потом
groupby()
групп данных. Вы должны быть осторожны, чтобы отсортировать данные по критериям прежде чем позвонить
groupby
или он не будет работать. способ
groupby
на самом деле просто перебирает список и всякий раз, когда ключевые изменения он создает новую группу.
0 голосов
от
itertools.groupby
-это инструмент для группировки элементов. Из документов, мы доберут еще, что он может сделать:
# [k for k, g in groupby('AAAABBBCCDAABBB')] 

# [list(g) for k, g in groupby('AAAABBBCCD')] 


groupby
объектов урожайность ключ-группа пар, где группа является генератор. Особенности А. группы последовательных элементов вместе Б. Группа все вхождения элемента, дан отсортированный итерируемый C. определить как группу элементов с ключом функция Сравнение
# Define a printer for comparing outputs
0 голосов
от
А еще трюк с метода groupBy, чтобы запустить кодирование длиной в одну строку:
[(c,len(list(cgen))) for c,cgen in groupby(some_string)]
дадут вам список из 2-кортежей, где первый элемент является голец и 2-это количество повторений. Редактировать: обратите внимание, что это то, что отделяет
itertools.groupby
из SQL
GROUP BY
семантики: модуле itertools нет (и вообще не могу) вроде итератора заранее, так что групп с таким же "ключ" не сливается.
0 голосов
от
Другой пример:
for key, igroup in itertools.groupby(xrange(12), lambda x: x // 5):
    print key, list(igroup)
результаты
0 [0, 1, 2, 3, 4]
1 [5, 6, 7, 8, 9]
2 [10, 11]
Обратите внимание, что компания igroup-это итератор (суб-итератор, документация называет). Это полезно для разбивки генератора:
def chunker(items, chunk_size):
    '''Group items in chunks of chunk_size'''
    for _key, group in itertools.groupby(enumerate(items), lambda x: x[0] // chunk_size):
        yield (g[1] for g in group)

with open('file.txt') as fobj:
    for chunk in chunker(fobj):
        process(chunk)
Еще один пример метода groupBy - когда ключи не сортируются. В следующем примере, детали в XX группируются по значениям в YY. В этом случае один набор нулей выводится во-первых, сопровождаемое теми, опять с нулями.
xx = range(10)
yy = [0, 0, 0, 1, 1, 1, 0, 0, 0, 0]
for group in itertools.groupby(iter(xx), lambda x: yy[x]):
    print group[0], list(group[1])
Производит:
0 [0, 1, 2]
1 [3, 4, 5]
0 [6, 7, 8, 9]
0 голосов
от
Предупреждение: Список синтаксис(метод groupBy(...)) не получится так, что вы намерены. Кажется, чтобы разрушить внутренний итератор объектов, поэтому использование
for x in list(groupby(range(10))):
    print(list(x[1]))
будет производить:
[]
[]
[]
[]
[]
[]
[]
[]
[]
[9]
Вместо этого, из списка(метод groupBy(...)), попробовать [(к, лист(г)) для K,G в метода groupBy(...)], или если вы используете такой синтаксис часто
def groupbylist(*args, **kwargs):
    return [(k, list(g)) for k, g in groupby(*args, **kwargs)]
и получите доступ к функциональности метода groupBy, избегая этих надоедливых (для малых данных) итераторы все вместе.
0 голосов
от
Я хотел бы привести еще один пример, где метод groupBy без сортировки не работает. Взято из примера Джеймс Сулак
from itertools import groupby

things = [("vehicle", "bear"), ("animal", "duck"), ("animal", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]

for key, group in groupby(things, lambda x: x[0]):
    for thing in group:
        print "A %s is a %s." % (thing[1], key)
    print " "
выход
A bear is a vehicle.

A duck is a animal.
A cactus is a animal.

A speed boat is a vehicle.
A school bus is a vehicle.
есть две группы с транспортного средства, в то время как можно было бы ожидать только одну группу
0 голосов
от
@CaptSolo, я попробовал ваш пример, но это не сработало.
from itertools import groupby 
[(c,len(list(cs))) for c,cs in groupby('Pedro Manoel')]
Выход:
[('P', 1), ('e', 1), ('d', 1), ('r', 1), ('o', 1), (' ', 1), ('M', 1), ('a', 1), ('n', 1), ('o', 1), ('e', 1), ('l', 1)]
Как вы можете видеть, есть две " О "и два "е", но у них в отдельные группы. Вот когда я понял, вам нужно отсортировать список, передаваемый в функцию метода groupBy. Таким образом, правильное использование будет:
name = list('Pedro Manoel')
name.sort()
[(c,len(list(cs))) for c,cs in groupby(name)]
Выход:
[(' ', 1), ('M', 1), ('P', 1), ('a', 1), ('d', 1), ('e', 2), ('l', 1), ('n', 1), ('o', 2), ('r', 1)]
Просто вспомнил, что если список не отсортирован, функция метода groupBy не будет работать!
0 голосов
от
Как я могу использовать модуле itertools в Python.метод groupBy()? Вы можете использовать метод groupBy для группы вещи для перебора. Вы дадите метода groupBy повторяемое, и дополнительный ключ/функция вызываемая по которому можно проверить предметы, как они вышли из метод, и он возвращает итератор, который дает два кортежа результата из ключевых востребованных и актуальных элементов в другом массиве. Из справки:
groupby(iterable[, keyfunc]) 

Вот пример метода groupBy с помощью сопрограмм в группу подсчета, он использует ключ отзывной (в данном случае, coroutine.send
), чтобы просто выплюнуть рассчитывать на сколько итераций и сгруппированы под-итератор элементов:
import itertools


def grouper(iterable, n):
    def coroutine(n):
        yield # queue up coroutine
        for i in itertools.count():
            for j in range(n):
                yield i
    groups = coroutine(n)
    next(groups) # queue up coroutine

    for c, objs in itertools.groupby(iterable, groups.send):
        yield c, list(objs)
    # or instead of materializing a list of objs, just:
    # return itertools.groupby(iterable, groups.send)

list(grouper(range(10), 3))
печать
[(0, [0, 1, 2]), (1, [3, 4, 5]), (2, [6, 7, 8]), (3, [9])]
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...