为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过python中的第一个字符有效地对巨大列表中的元素进行分组

如何通过python中的第一个字符有效地对巨大列表中的元素进行分组

梦里花落0921 2021-10-05 16:27:32
import jsonfrom itertools import groupby#Load datawith open('input.txt', 'r') as f:    concepts = []    for concept in f:        concepts.append(concept.strip())print(len(concepts))concepts_list = [list(g) for k, g in groupby(concepts, key=lambda x: x[0])]concepts_dict = {}for item in concepts_list:    concepts_dict[item[0][0]] = itemwith open("concepts_preprocessed_dictionary.txt", "w") as fw:    fw.write(json.dumps(concepts_dict))但是,我想知道为什么当列表中有大量概念(大约 13,000,000 个概念)时这段代码不起作用。令人惊讶的是,程序在几秒钟内执行,当我检查字典时,它包含错误的结果(换句话说,字典文件的大小只有 1KB,每个分组列表主要包含一两个元素)。不幸的是,我无法分享我的概念清单,因为它违反了一些隐私问题。但是我在以下 github 页面中发现了一个很长的单词列表:https : //raw.githubusercontent.com/dwyl/english-words/master/words.txt但是,与上述数据集不同,我当前的数据集仅按第一个字符按字母顺序排列(即如下)我的数据集:只有第一个字母是m,但其余单词没有按顺序排列方法机器学习麦克风我提到的数据集:根据字符很好地排序机器学习方法麦克风如果需要任何进一步的细节,请告诉我。
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

你真的不需要使用groupby来做到这一点。


考虑您的链接示例:


list1=['hello','hope','hate','hack','bit','basket','code','come','chess']

您可以创建使用本机 Python 字典描述的组:


groups={}

for word in list1:

    groups.setdefault(word[0],[]).append(word)


>>> groups

{'h': ['hello', 'hope', 'hate', 'hack'], 'b': ['bit', 'basket'], 'c': ['code', 'come', 'chess']}

或者,defaultdict如果您愿意:


from collections import defaultdict 

groups=defaultdict(list)    

for word in list1:

    groups[word[0]].append(word)


>>> groups

defaultdict(<class 'list'>, {'h': ['hello', 'hope', 'hate', 'hack'], 'b': ['bit', 'basket'], 'c': ['code', 'come', 'chess']})

这两种方法都适用于完全未排序的数据,并根据第一个字母收集单词。然后,如果需要,您可以自由使用该 dict 的值来制作列表列表:


>>> sorted(groups.values(), key=lambda s: s[0])

[['bit', 'basket'], ['code', 'come', 'chess'], ['hello', 'hope', 'hate', 'hack']]

现在,如果您出于某种原因仍想使用groupby,您可能会执行以下操作:


groups={}

for k,v in groupby(list1, key=lambda s: s[0]):

    groups.setdefault(k,[]).extend(v)


查看完整回答
反对 回复 2021-10-05
  • 1 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信