Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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_Python 3.x_Group By_Itertools - Fatal编程技术网

Python 为什么itertools.groupby()不';不行?

Python 为什么itertools.groupby()不';不行?,python,python-3.x,group-by,itertools,Python,Python 3.x,Group By,Itertools,我已经检查了一些关于groupby()的主题,但我不知道我的示例有什么问题: students = [{'name': 'Paul', 'mail': '@gmail.com'}, {'name': 'Tom', 'mail': '@yahoo.com'}, {'name': 'Jim', 'mail': 'gmail.com'}, {'name': 'Jules', 'mail': '@somet

我已经检查了一些关于
groupby()
的主题,但我不知道我的示例有什么问题:

students = [{'name': 'Paul',    'mail': '@gmail.com'},
            {'name': 'Tom',     'mail': '@yahoo.com'},
            {'name': 'Jim',     'mail': 'gmail.com'},
            {'name': 'Jules',   'mail': '@something.com'},
            {'name': 'Gregory', 'mail': '@gmail.com'},
            {'name': 'Kathrin', 'mail': '@something.com'}]

key_func = lambda student: student['mail']

for key, group in itertools.groupby(students, key=key_func):
    print(key)
    print(list(group))

这将分别打印每个学生。为什么我只得到3个组:
@gmail.com
@yahoo.com
@something.com

itertools使用数据的排序顺序。您的列表未排序

因此,如果你有[“gmail.com”、“something.com”、“gmail.com”],itertools将创建三个组。这与某些函数式语言中的groupby(或为此而使用的Python)不同

你需要先把字典分类

import itertools

students = [{'name': 'Paul', 'mail': '@gmail.com'}, {'name': 'Tom',    'mail': '@yahoo.com'},
            {'name': 'Jim', 'mail': 'gmail.com'}, {'name': 'Jules', 'mail': '@something.com'},
            {'name': 'Gregory', 'mail': '@gmail.com'}, {'name': 'Kathrin', 'mail': '@something.com'}]


 for key, group in itertools.groupby(sorted(students, key=lambda x: x["mail"]), key=lambda student: student['mail']):
     print(key)
     print(list(group))

# @gmail.com
# [{'name': 'Paul', 'mail': '@gmail.com'}, {'name': 'Gregory', 'mail': '@gmail.com'}]
# @something.com
# [{'name': 'Jules', 'mail': '@something.com'}, {'name': 'Kathrin', 'mail': '@something.com'}]
# @yahoo.com
#[{'name': 'Tom', 'mail': '@yahoo.com'}]
#gmail.com
# [{'name': 'Jim', 'mail': 'gmail.com'}]

itertools使用数据的排序顺序。您的列表未排序

因此,如果你有[“gmail.com”、“something.com”、“gmail.com”],itertools将创建三个组。这与某些函数式语言中的groupby(或为此而使用的Python)不同

你需要先把字典分类

import itertools

students = [{'name': 'Paul', 'mail': '@gmail.com'}, {'name': 'Tom',    'mail': '@yahoo.com'},
            {'name': 'Jim', 'mail': 'gmail.com'}, {'name': 'Jules', 'mail': '@something.com'},
            {'name': 'Gregory', 'mail': '@gmail.com'}, {'name': 'Kathrin', 'mail': '@something.com'}]


 for key, group in itertools.groupby(sorted(students, key=lambda x: x["mail"]), key=lambda student: student['mail']):
     print(key)
     print(list(group))

# @gmail.com
# [{'name': 'Paul', 'mail': '@gmail.com'}, {'name': 'Gregory', 'mail': '@gmail.com'}]
# @something.com
# [{'name': 'Jules', 'mail': '@something.com'}, {'name': 'Kathrin', 'mail': '@something.com'}]
# @yahoo.com
#[{'name': 'Tom', 'mail': '@yahoo.com'}]
#gmail.com
# [{'name': 'Jim', 'mail': 'gmail.com'}]

首先,有些邮件是
gmail.com
,有些是
@gmail.com
,这就是为什么它们被视为单独的组

groupby
还希望数据通过相同的
函数进行预排序,这解释了为什么您会两次获得
@something.com

从:

。。。通常,iterable需要已经在同一个键函数上进行排序

在修复了排序和
gmail.com
/
@gmail.com
之后,我们得到了预期的输出:

import itertools

students = [{'name': 'Paul', 'mail': '@gmail.com'}, {'name': 'Tom', 'mail': '@yahoo.com'},
            {'name': 'Jim', 'mail': '@gmail.com'}, {'name': 'Jules', 'mail': '@something.com'},
            {'name': 'Gregory', 'mail': '@gmail.com'}, {'name': 'Kathrin', 'mail': '@something.com'}]

key_func = lambda student: student['mail']

students.sort(key=key_func)

for key, group in itertools.groupby(students, key=key_func):
    print(key)
    print(list(group))

#  @gmail.com
#  [{'mail': '@gmail.com', 'name': 'Paul'},
#   {'mail': '@gmail.com', 'name': 'Jim'},
#   {'mail': '@gmail.com', 'name': 'Gregory'}]
#  @something.com
#  [{'mail': '@something.com', 'name': 'Jules'},
#   {'mail': '@something.com', 'name': 'Kathrin'}]
#  @yahoo.com
#  [{'mail': '@yahoo.com', 'name': 'Tom'}]

首先,有些邮件是
gmail.com
,有些是
@gmail.com
,这就是为什么它们被视为单独的组

groupby
还希望数据通过相同的
函数进行预排序,这解释了为什么您会两次获得
@something.com

从:

。。。通常,iterable需要已经在同一个键函数上进行排序

在修复了排序和
gmail.com
/
@gmail.com
之后,我们得到了预期的输出:

import itertools

students = [{'name': 'Paul', 'mail': '@gmail.com'}, {'name': 'Tom', 'mail': '@yahoo.com'},
            {'name': 'Jim', 'mail': '@gmail.com'}, {'name': 'Jules', 'mail': '@something.com'},
            {'name': 'Gregory', 'mail': '@gmail.com'}, {'name': 'Kathrin', 'mail': '@something.com'}]

key_func = lambda student: student['mail']

students.sort(key=key_func)

for key, group in itertools.groupby(students, key=key_func):
    print(key)
    print(list(group))

#  @gmail.com
#  [{'mail': '@gmail.com', 'name': 'Paul'},
#   {'mail': '@gmail.com', 'name': 'Jim'},
#   {'mail': '@gmail.com', 'name': 'Gregory'}]
#  @something.com
#  [{'mail': '@something.com', 'name': 'Jules'},
#   {'mail': '@something.com', 'name': 'Kathrin'}]
#  @yahoo.com
#  [{'mail': '@yahoo.com', 'name': 'Tom'}]

我不是落选者,但:这与口述是无序的这一事实无关,OP是通过字典列表进行分组的。你可以在我的回答中看到为什么它不能像他们期望的那样工作。谢谢你,DeepSpace。修正了。我不是落选者,但是:这与dicts是无序的这一事实无关,OP是通过字典列表进行分组的。你可以在我的回答中看到为什么它不能像他们期望的那样工作。谢谢你,DeepSpace。修正了。吉姆的电子邮件是
gmail.com
,而不是像其他人一样
@gmail.com
。打字错误?吉姆的电子邮件是
gmail.com
,而不是像其他邮件一样
@gmail.com
。打字错误?好的,我读过文档,我看到序列必须排序,但我丢失了,因为字典无法排序。我创建了一个混乱的代码。@kviatek它是关于对字典列表排序的,而不是字典本身。我试图将问题编辑成更合适的重复目标;你介意我把吉姆的电子邮件从
gmail.com
改成
@gmail.com
吗?这与我认为的问题无关。@Aran_-Fey是的,当然,我看到你已经这么做了,但我还是回答了。是的,我知道,但就像我说过的,我在所有的物体中迷失了方向,我最终尝试对字典进行分类,很明显,什么不是wat必须做的。现在一切都清楚了。好的,我已经阅读了文档,我看到序列必须被排序,但我丢失了,因为字典无法排序。我创建了一个混乱的代码。@kviatek它是关于对字典列表排序的,而不是字典本身。我试图将问题编辑成更合适的重复目标;你介意我把吉姆的电子邮件从
gmail.com
改成
@gmail.com
吗?这与我认为的问题无关。@Aran_-Fey是的,当然,我看到你已经这么做了,但我还是回答了。是的,我知道,但就像我说过的,我在所有的物体中迷失了方向,我最终尝试对字典进行分类,很明显,什么不是wat必须做的。现在一切都清楚了。