通过拼写单词排序字典 - Python 3

时间:2016-10-25 16:10:58

标签: python dictionary pycharm ordereddictionary

我想知道是否有人知道通过特定单词的拼写来制作字典的方法?由于字典是未分类的,我使用了OrderedDict,但我相信你只能通过键和值对它进行排序。知道如何以这种方式订购吗?

这是我正在进行的项目的一部分:

word = input("word")
list_1 = list(word)

word>? apple

len_list_1 = len(list_1)


dict = {}

for x in range(0, len(list_1)):
    dict[list_1[x]] = list_1.count(list_1[x])

print(dict)

>{'l': 1, 'p': 2, 'a': 1, 'e': 1}

我试图按照' apple'这个词的顺序保留它。然后以某种方式将字典转换为纯文本:

{'a' : 1, 'p': 2, 'l': 1, 'e': 1}
> a1p2l1e1 #as my final answer

2 个答案:

答案 0 :(得分:3)

首先,请注意您的代码是一种非常低效且简单的方式,可以非常简单地执行某些操作:

>>> from collections import Counter
>>> Counter('apple')
Counter({'p': 2, 'a': 1, 'e': 1, 'l': 1})

(效率不高,因为你每次都在计算每一封信,例如' aaaaa'会计算5次; unpythonic,因为你声明并且没有使用使用range(len(...))进行长度变量和循环抛出,这几乎不是一个好主意。)

然后,您可以对此计数器进行排序,并将其设为OrderedDict。我按照单词中的第一个出现排序:

>>> word = 'apple'
>>> c = Counter(word)
>>> OrderedDict(sorted(c.items(), key=lambda x: word.index(x[0])))
OrderedDict([('a', 1), ('p', 2), ('l', 1), ('e', 1)])

请注意,如果您只是对字母进行分组,答案将会大不相同:如果您想要执行'b1o1b1'之类的操作,则字典不是正确的数据结构。

如果您想要的输出只是字符串'a1p2l1e1',您可以执行以下操作:

>>> word = 'apple'
>>> c = Counter(word)
>>> sorted_letter_counts = sorted(c.items(), key=lambda x: word.index(x[0]))
>>> ''.join(c + str(n) for c,n in sorted_letter_counts)
'a1p2l1e1'

或者作为一个单行:

>>> word = 'apple'
>>> ''.join(c + str(n) for c,n in sorted(Counter('apple').items(), key=lambda x: word.index(x[0])))
'a1p2l1e1'

答案 1 :(得分:0)

Straight from the docs

class OrderedCounter(collections.Counter, collections.OrderedDict):
    'Counter that remembers the order elements are first encountered'

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, collections.OrderedDict(self))

    def __reduce__(self):
        '''__reduce__ is for pickling'''
        return self.__class__, (collections.OrderedDict(self),)

用法:

>>> foo = OrderedCounter('apple')
>>> foo
OrderedCounter(OrderedDict([('a', 1), ('p', 2), ('l', 1), ('e', 1)]))
>>>

>>> for thing in foo.items():
    print(thing)


('a', 1)
('p', 2)
('l', 1)
('e', 1)
>>>