Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用itertools.groupby()?_Python_Itertools - Fatal编程技术网

Python 如何使用itertools.groupby()?

Python 如何使用itertools.groupby()?,python,itertools,Python,Itertools,对于如何实际使用Python的itertools.groupby()函数,我还没有找到一个可以理解的解释。我想做的是: 拿一个列表——在本例中,是对象化的lxml元素的子元素 根据一些标准将其分成若干组 然后分别迭代这些组中的每一个 我已经复习过了,但是我很难将它们应用到简单的数字列表之外 那么,如何使用itertools.groupby()?我还应该使用其他技术吗?如果能找到好的“先决条件”阅读指南,我们将不胜感激。Python文档上的示例非常简单: groups = [] uniquek

对于如何实际使用Python的
itertools.groupby()
函数,我还没有找到一个可以理解的解释。我想做的是:

  • 拿一个列表——在本例中,是对象化的
    lxml
    元素的子元素
  • 根据一些标准将其分成若干组
  • 然后分别迭代这些组中的每一个
我已经复习过了,但是我很难将它们应用到简单的数字列表之外


那么,如何使用
itertools.groupby()
?我还应该使用其他技术吗?如果能找到好的“先决条件”阅读指南,我们将不胜感激。

Python文档上的示例非常简单:

groups = []
uniquekeys = []
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)
因此,在您的例子中,数据是一个节点列表,
keyfunc
是criteria函数的逻辑所在,然后
groupby()
对数据进行分组


在调用
groupby
之前,必须小心地按照标准对数据进行排序,否则它将不起作用
groupby
方法实际上只是在一个列表中迭代,只要键发生变化,它就会创建一个新的组。

Python文档上的示例非常简单:

groups = []
uniquekeys = []
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)
因此,在您的例子中,数据是一个节点列表,
keyfunc
是criteria函数的逻辑所在,然后
groupby()
对数据进行分组


在调用
groupby
之前,必须小心地按照标准对数据进行排序,否则它将不起作用
groupby
方法实际上只是在一个列表中迭代,只要键发生变化,它就会创建一个新的组。

重要提示:您必须先对数据进行排序


我没有得到的部分是在示例构造中

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()

这里,
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 + ".")
这将为您提供以下输出:

动物:熊和鸭。
植物:仙人掌。
车辆:快艇和校车


重要提示:您必须先对数据进行排序


我没有得到的部分是在示例构造中

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()

这里,
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 + ".")
这将为您提供以下输出:

动物:熊和鸭。
植物:仙人掌。
车辆:快艇和校车


groupby的一个neato技巧是在一行中运行长度编码:

[(c,len(list(cgen))) for c,cgen in groupby(some_string)]
将给出一个2元组列表,其中第一个元素是char,第二个元素是重复次数


编辑:请注意,这就是将
itertools.groupby
与SQL
groupby
语义分开的原因:itertools不会(通常也不能)提前对迭代器进行排序,因此不会合并具有相同“键”的组。

groupby的一个小技巧是在一行中运行长度编码:

[(c,len(list(cgen))) for c,cgen in groupby(some_string)]
将给出一个2元组列表,其中第一个元素是char,第二个元素是重复次数


编辑:请注意,这就是将
itertools.groupby
与SQL
groupby
语义分开的原因:itertools不会(通常也不会)提前对迭代器进行排序,因此不会合并具有相同“键”的组。

@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)]
[(' ', 1), ('M', 1), ('P', 1), ('a', 1), ('d', 1), ('e', 2), ('l', 1), ('n', 1), ('o', 2), ('r', 1)]
正如你所看到的,有两个o和两个e,但它们分为不同的组。这时我意识到需要对传递给groupby函数的列表进行排序。因此,正确的用法是:

name = list('Pedro Manoel')
name.sort()
[(c,len(list(cs))) for c,cs in groupby(name)]
输出:

[('P', 1), ('e', 1), ('d', 1), ('r', 1), ('o', 1), (' ', 1), ('M', 1), ('a', 1), ('n', 1), ('o', 1), ('e', 1), ('l', 1)]
[(' ', 1), ('M', 1), ('P', 1), ('a', 1), ('d', 1), ('e', 2), ('l', 1), ('n', 1), ('o', 2), ('r', 1)]

请记住,如果列表未排序,groupby函数将不起作用

@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)]
[(' ', 1), ('M', 1), ('P', 1), ('a', 1), ('d', 1), ('e', 2), ('l', 1), ('n', 1), ('o', 2), ('r', 1)]
如你所见,他们
groupby(iterable[, keyfunc]) -> create an iterator which returns
(key, sub-iterator) grouped by each value of key(value).
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])]
from itertools import groupby

#user input

myinput = input()

#creating empty list to store output

myoutput = []

for k,g in groupby(myinput):

    myoutput.append((len(list(g)),int(k)))

print(*myoutput)
from itertools import groupby

val = [{'name': 'satyajit', 'address': 'btm', 'pin': 560076}, 
       {'name': 'Mukul', 'address': 'Silk board', 'pin': 560078},
       {'name': 'Preetam', 'address': 'btm', 'pin': 560076}]


for pin, list_data in groupby(sorted(val, key=lambda k: k['pin']),lambda x: x['pin']):
...     print pin
...     for rec in list_data:
...             print rec
... 
o/p:

560076
{'name': 'satyajit', 'pin': 560076, 'address': 'btm'}
{'name': 'Preetam', 'pin': 560076, 'address': 'btm'}
560078
{'name': 'Mukul', 'pin': 560078, 'address': 'Silk board'}
# Define a printer for comparing outputs
>>> def print_groupby(iterable, keyfunc=None):
...    for k, g in it.groupby(iterable, keyfunc):
...        print("key: '{}'--> group: {}".format(k, list(g)))
# Feature A: group consecutive occurrences
>>> print_groupby("BCAACACAADBBB")
key: 'B'--> group: ['B']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A', 'A']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A', 'A']
key: 'D'--> group: ['D']
key: 'B'--> group: ['B', 'B', 'B']

# Feature B: group all occurrences
>>> print_groupby(sorted("BCAACACAADBBB"))
key: 'A'--> group: ['A', 'A', 'A', 'A', 'A']
key: 'B'--> group: ['B', 'B', 'B', 'B']
key: 'C'--> group: ['C', 'C', 'C']
key: 'D'--> group: ['D']

# Feature C: group by a key function
>>> # islower = lambda s: s.islower()                      # equivalent
>>> def islower(s):
...     """Return True if a string is lowercase, else False."""   
...     return s.islower()
>>> print_groupby(sorted("bCAaCacAADBbB"), keyfunc=islower)
key: 'False'--> group: ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D']
key: 'True'--> group: ['a', 'a', 'b', 'b', 'c']
# OP: Yes, you can use `groupby`, e.g. 
[do_something(list(g)) for _, g in groupby(lxml_elements, criteria_func)]
           def groupby(data):
                kv = {}
                for k,v in data:
                    if k not in kv:
                         kv[k]=[v]
                    else:
                        kv[k].append(v)
           return kv

     Run on ipython:
       In [10]: data = [('a', 1), ('b',2),('a',2)]

        In [11]: groupby(data)
        Out[11]: {'a': [1, 2], 'b': [2]}
-- 1 --
A
B
C
-- 2 --
D
E
-- 3 --
F