2016-10-25 5 views
1

Мне было интересно, знал ли кто-нибудь, как сделать словарь, упорядоченный по написанию определенного слова? Поскольку словарь не сортирован, я прибегал к использованию OrderedDict, но я считаю, что вы можете сортировать его только через ключи и значения. Любая идея о том, как заказать его таким образом?Заказ словаря по написанию слова - Python 3

Вот часть проекта я работал на:

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} 

Я пытался удержать его, чтобы слова «яблоко», а затем каким-то образом преобразовать словарь в виде простого текста:

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

Чтобы уточнить, что вы хотите, чтобы это упорядочилось по порядку «первым увиденным» одним словом? Итак, 'mississippi' даст' {'m': 1, 'i': 4, 's': 4, 'p': 2} '/' m1i4s4p4'? –

+0

@AndrewGelnar Да, это именно то, что мне нужно. –

ответ

3

в качестве первой точки, обратите внимание, что ваш код является довольно неэффективным и unpythonic способ сделать что-то очень простое:

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

(Неэффективно, потому что вы каждый раз считаете каждую букву, например. «aaaaa» будет считать «a» 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' 
+0

Большое спасибо! Я так многому научился на вашем примере. Я новичок в Python и все еще пытаюсь понять, что такое Pythonic, а что нет. –

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) 
>>> 

 Смежные вопросы

  • Нет связанных вопросов^_^