我正在关注以下stackoverflow问题的答案,以完成我的任务,如下所示。 python list group by first character
import json
from itertools import groupby
#Load data
with 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]] = item
with 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
,但其余单词没有按照字母顺序排序
我提到的数据集:根据字符排列得很好
请让我知道是否需要其他详细信息。
答案 0 :(得分:2)
您真的不需要 使用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)