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必须做的。现在一切都清楚了。