按字母顺序排序元组

时间:2017-04-04 09:46:56

标签: python python-2.7 python-3.x

我正在尝试使用python按字母顺序排列一系列bigrams元组。我的输出现在看起来像这样:

('hello', 'how')
('how', 'are')
('are', 'you')
('you', '?')
('Are', 'you')
('you', 'okay')
('okay', '?')

我希望输出看起来像这样,按字母顺序排列,每个二元组只出现一次,最好是频率计数:

('are', 'you'), 2
('hello', 'how'), 1
('how', 'are'), 1
('okay', '?'), 1
('you', 'okay'), 1
('you', '?'), 1

我的代码如下所示:

def bigram(x):
    with open (x, 'r', encoding='utf-8') as f:
        mylist = f.read()
        n = 2
        grams = ngrams(nltk.word_tokenize(mylist), n)
        for bigrams in grams:
            return bigrams

我真的很感激一些帮助,谢谢!

3 个答案:

答案 0 :(得分:2)

您需要执行几个步骤(阅读grams后):

首先,小写一切以轻松找到双打:

grams = [ (a.lower(), b.lower()) for (a, b) in grams ]

其次,将grams分组并计算它们:

import collections
counted = collections.Counter(grams)

第三,对计算的东西进行排序:

for gram, count in sorted(counted.items()):
    print gram, count

答案 1 :(得分:1)

首先,您必须将所有数据设为小写:

L = [('hello', 'how'), ('how', 'are'), ('are', 'you') ,('you', '?'), ('Are', 'you') ,('you', 'okay') ,('okay', '?')]
L = [tuple(s.lower() for s in x) for x in L]

然后计算频率:

import collections
counter=collections.Counter(L)

然后你可以对此进行排序:

print(collections.OrderedDict(sorted(counter.items())))
#OrderedDict([(('are', 'you'), 2), (('hello', 'how'), 1), (('how', 'are'), 1), (('okay', '?'), 1), (('you', '?'), 1), (('you', 'okay'), 1)])

答案 2 :(得分:0)

查看Countersorted。使用计数器计算每个双字母组的出现次数,并使用sorted对按字母顺序排列bigrams和对应的countd。