如何计算以相同后缀(单词结尾)结尾的单词数?

时间:2018-12-19 21:19:00

标签: python-2.7

我正在尝试1st 根据单词的后两个字母(后缀)划分四个字母的单词,而2nd 计算这些结尾中每个单词有多少个单词

我有一个包含3164个单词的列表,称为filterd,我已经按它们的后缀对其进行了排序,这似乎没有什么帮助。

(我想创建一个以后缀为键,单词为列表的字典,但我不知道从哪里开始!)这就像:

输出:

dic = {'ab': ['Ahab', 'Arab', 'Saab, ...]; 'al': ['Aral', 'Baal', ...]}

,依此类推。可以吗?

filtered.sort(key= lambda x : x[-2:])
print(filtered) 

['HSBC', 'UCLA', 'FNMA', 'SARS', 'OHSA', 'Ahab', 'Arab', 'Saab', 'blab', 'crab', 'drab', 'flab', 'grab', 'scab', 'slab', 'stab', 'swab', 'Brad', 'Chad', 'Head', 'Mead', 'Thad', 'Vlad', 'bead', 'brad', 'clad', 'dead', 'glad', 'goad', 'grad', 'head', 'iPad', 'lead', 'load', 'mead', 'quad', 'read', 'road', 'scad', 'shad', 'toad', 'Olaf', 'Piaf', 'deaf', 'leaf', 'loaf', 'brag', 'crag', 'drag', 'flag', 'shag', 'slag', 'snag', 'stag', 'swag', 'Leah', 'Noah', 'Ptah', 'Utah', 'blah', 'shah', 'yeah', 'Thai', 'beak', 'flak', 'leak', 'peak', 'soak', 'teak', 'weak', 'Aral', 'Baal', 'Dial', 'Neal', 'Opal', 'Ural', 'anal', 'coal', 'deal', 'dial', 'dual', 'foal', 'goal', 'heal', 'meal', 'opal', 'oral', 'oval', 'peal', 'real', 'seal', 'teal', 'veal', 'vial', 'weal', 'zeal', 'Adam', 'Edam', 'Elam', 'Guam', 'Siam', 'Spam', 'beam', 'clam', 'cram', 'dram', 'exam', 'foam', 'gram', 'imam', 'loam', 'pram', 'ream', 'roam', 'scam', 'seam', 'sham', 'slam', 'swam', 'team', 'tram', 'wham', 'Adan', 'Alan', 'Bean', 'Bran', 'Chan', 'Dean', 'Evan', 'Fran', 'Iran', 'Ivan', 'Jean', 'Joan', 'Juan', 'Khan', 'Klan', 'Kwan', 'Lean', 'Oman', 'Oran', 'Ryan', 'Sean', 'Sian', 'Stan', 'Tran', 'Yuan', 'bean', 'bran', 'clan', 'dean', 'flan', 'khan', 'lean', 'loan', 'mean', 'moan', 'plan', 'roan', 'scan', 'span', 'swan', 'than', 'wean', 'chap', 'clap', 'crap', 'flap', 'heap', 'leap', 'reap', 'slap', 'snap', 'soap', 'swap', 'trap', 'wrap', 'Iraq', 'Adar', 'Alar', 'Iyar', 'Lear', 'Omar', 'Paar', 'Saar', 'Thar', 'afar', 'agar', 'ajar', 'bear', 'boar', 'char', 'czar', 'dear', 'fear', 'gear', 'hear', 'liar', 'near', 'pear', 'rear', 'roar', 'scar', 'sear', 'soar', 'spar', 'star', 'tear', 'tsar', 'tzar', 'wear', 'year', 'Boas', 'Haas', 'Xmas', 'alas', 'baas', 'bias', 'boas', 'bras', 'eras', 'leas', 'peas', 'seas', 'spas', 'teas', 'yeas', 'Fiat', 'beat', 'boat', 'brat', 'chat', 'coat', 'feat', 'fiat', 'flat', 'frat', 'gnat', 'goat', 'heat', 'meat', 'moat', 'neat', 'peat', 'scat', 'seat'...]

2 个答案:

答案 0 :(得分:2)

假设后缀始终是两个字母,并且区分大小写,则可以遍历单词列表并将每个单词附加到列表的字典中,并以单词的最后两个字母作为键:

dic = {}
for word in filtered:
    dic.setdefault(word[-2:], []).append(word)

dic变为:

{'BC': ['HSBC'], 'LA': ['UCLA'], 'MA': ['FNMA'], 'RS': ['SARS'], 'SA': ['OHSA'], 'ab': ['Ahab', 'Arab', 'Saab', 'blab', 'crab', 'drab', 'flab', 'grab', 'scab', 'slab', 'stab', 'swab'], 'ad': ['Brad', 'Chad', 'Head', 'Mead', 'Thad', 'Vlad', 'bead', 'brad', 'clad', 'dead', 'glad', 'goad', 'grad', 'head', 'iPad', 'lead', 'load', 'mead', 'quad', 'read', 'road', 'scad', 'shad', 'toad'], 'af': ['Olaf', 'Piaf', 'deaf', 'leaf', 'loaf'], 'ag': ['brag', 'crag', 'drag', 'flag', 'shag', 'slag', 'snag', 'stag', 'swag'], 'ah': ['Leah', 'Noah', 'Ptah', 'Utah', 'blah', 'shah', 'yeah'], 'ai': ['Thai'], 'ak': ['beak', 'flak', 'leak', 'peak', 'soak', 'teak', 'weak'], 'al': ['Aral', 'Baal', 'Dial', 'Neal', 'Opal', 'Ural', 'anal', 'coal', 'deal', 'dial', 'dual', 'foal', 'goal', 'heal', 'meal', 'opal', 'oral', 'oval', 'peal', 'real', 'seal', 'teal', 'veal', 'vial', 'weal', 'zeal'], 'am': ['Adam', 'Edam', 'Elam', 'Guam', 'Siam', 'Spam', 'beam', 'clam', 'cram', 'dram', 'exam', 'foam', 'gram', 'imam', 'loam', 'pram', 'ream', 'roam', 'scam', 'seam', 'sham', 'slam', 'swam', 'team', 'tram', 'wham'], 'an': ['Adan', 'Alan', 'Bean', 'Bran', 'Chan', 'Dean', 'Evan', 'Fran', 'Iran', 'Ivan', 'Jean', 'Joan', 'Juan', 'Khan', 'Klan', 'Kwan', 'Lean', 'Oman', 'Oran', 'Ryan', 'Sean', 'Sian', 'Stan', 'Tran', 'Yuan', 'bean', 'bran', 'clan', 'dean', 'flan', 'khan', 'lean', 'loan', 'mean', 'moan', 'plan', 'roan', 'scan', 'span', 'swan', 'than', 'wean'], 'ap': ['chap', 'clap', 'crap', 'flap', 'heap', 'leap', 'reap', 'slap', 'snap', 'soap', 'swap', 'trap', 'wrap'], 'aq': ['Iraq'], 'ar': ['Adar', 'Alar', 'Iyar', 'Lear', 'Omar', 'Paar', 'Saar', 'Thar', 'afar', 'agar', 'ajar', 'bear', 'boar', 'char', 'czar', 'dear', 'fear', 'gear', 'hear', 'liar', 'near', 'pear', 'rear', 'roar', 'scar', 'sear', 'soar', 'spar', 'star', 'tear', 'tsar', 'tzar', 'wear', 'year'], 'as': ['Boas', 'Haas', 'Xmas', 'alas', 'baas', 'bias', 'boas', 'bras', 'eras', 'leas', 'peas', 'seas', 'spas', 'teas', 'yeas'], 'at': ['Fiat', 'beat', 'boat', 'brat', 'chat', 'coat', 'feat', 'fiat', 'flat', 'frat', 'gnat', 'goat', 'heat', 'meat', 'moat', 'neat', 'peat', 'scat', 'seat']}

答案 1 :(得分:1)

我为您提供两种解决方案。

解决方案1:

>>> from itertools import groupby
>>> key_func = lambda s: s[-2:]
>>> suffix_dict = dict([(suffix, list(words)) for suffix, words in groupby(sorted(filtered, key=key_func), key_func)])

解决方案2:

>>> from collections import defaultdict
>>> suffix_dict = defaultdict(list)
>>> for word in filtered:
...     suffix_dict[word[-2:]].append(word)

与解决方案1相比,解决方案2会相对更快。Defaultdict将永远不会引发KeyError。 Defaultdict的工作方式与python中的dict完全相同,它为不存在的键提供默认值。更重要的是,在涉及大量更新操作时,通常认为defaultdict比dict更快,更优化。几个性能结果表明,defaultdict通常比普通dict 12更好。

解决方案1优于其他解决方案的好处:Grouby需要两个参数-它需要分组的数据和要分组的函数。在needs to be sorted上迭代的数据通常与键功能相同。 因此,当您获得最终结果“ suffix_dict”时,每个单词列表将已经排序。而在解决方案1中,将保留原始列表“已过滤”中单词的顺序。

此外,这两种解决方案之间的性能都差强人意,尤其是当您的原始列表很小时。

因此您可以选择更适合您的需求。

计数部分很简单:

>>> { k: len(v) for k, v in suffix_dict.items()}

参考文献:

  1. https://medium.com/@jaturongkongmanee/better-using-defaultdict-instead-of-just-only-dictionaries-in-python-5f66393363cd

  2. https://www.reddit.com/r/learnpython/comments/2n2dgn/performance_difference_defaultdict_versus/