2016-07-10 2 views
0

Я работаю на небольшую программу, как написано нижесортировочных пар ключ-значение в питона

"""Count words.""" 
    # TODO: Count the number of occurences of each word in s 

    # TODO: Sort the occurences in descending order (alphabetically in case of ties) 

    # TODO: Return the top n words as a list of tuples (<word>, <count>)  
from operator import itemgetter 

def count_words(s, n): 
    """Return the n most frequently occuring words in s.""" 

    t1=[] 
    t2=[] 
    temp={} 
    top_n={} 
    words=s.split() 
    for word in words: 
     if word not in temp: 
      t1.append(word) 
      temp[word]=1 
     else: 
      temp[word]+=1 

    t1 = sorted(temp,key=temp.get,reverse=True) # to get sorted keys 
    t2 = sorted(temp.values(),reverse=True) # to get sorted values 
    top_n = dict(zip(t1,t2)) 
    print top_n 

    return 


def test_run(): 
    """Test count_words() with some inputs.""" 
    count_words("cat bat mat cat bat cat", 3) 
    count_words("betty bought a bit of butter but the butter was bitter", 3) 


if __name__ == '__main__': 
    test_run() 

Я просто пытаюсь отсортировать пару ключ-значение. У меня есть ниже вопросы:

  1. В приведенной выше программе, когда я печатаю слияние двух отсортированных его показывает мне только несортированный слияние
  2. Как получить отсортированный пару ключей значение по питона функции тока FXN, который я используя его wither возвращает ключи или значения. Можем ли мы получить как-то?
+0

ли вы смотрите в [ collections.Counter] (https://docs.python.org/2.7/library/collections.html#collections.Counter)? Вы можете также рассмотреть [collections.defaultdict] (https://docs.python.org/2.7/library/collections.html#collections.defaultdict), чтобы избавиться от вашего оператора if. 'defaultdict (0)' будет создавать словарь, который использует 0 в качестве значения по умолчанию для неизвестных ключей. – mhoff

ответ

3

В соответствии с комментарием вверху вы хотите вернуть список кортежей ключа/значения. Таким образом, вы хотите, чтобы отсортировать словаря элементы значением:

sorted(temp.items(), key=itemgetter(1), reverse=True) 

Следует заметить, что ваша стратегия сортировки ключей и значений отдельно не будет работать - вы будете в конечном итоге соответствующие ключи с которые не принадлежат друг другу.

отметить также, что существует collections.Counter, который оптимизирован для выполнения именно этой задачи (см .most_common)

1
sorted([(value,key) for (key,value) in temp.items()]) 
0

Вы можете отсортировать словарь по значению, как это:

sorted(temp.items(), key = lambda x: x[1], reverse = True) 
Смежные вопросы