2014-01-30 3 views
-4

Я пытаюсь сортировать словарь по списку списков. Элементы в списке списков - это ключи в словаре. Я спросил его раньше, но ответы не решили проблему.Сортировка словаря по спискам списков

Мой список входов:

mylist= [ 
    ['why', 'was', 'cinderella', 'late', 'for', 'the', 'ball', 'she', 'forgot', 'to', 'swing', 'the', 'bat'], 
    ['why', 'is', 'the', 'little', 'duck', 'always', 'so', 'sad', 'because', 'he', 'always', 'sees', 'a', 'bill', 'in', 'front', 'of', 'his', 'face'], 
    ['what', 'has', 'four', 'legs', 'and', 'goes', 'booo', 'a', 'cow', 'with', 'a', 'cold'], 
    ['what', 'is', 'a', 'caterpillar', 'afraid', 'of', 'a', 'dogerpillar'], 
    ['what', 'did', 'the', 'crop', 'say', 'to', 'the', 'farmer', 'why', 'are', 'you', 'always', 'picking', 'on', 'me'] 
    ] 

Мой словарь несколько выглядит следующим образом:

myDict = {'to': [7, 11, 17, 23, 24, 25, 26, 33, 34, 37, 39, 41, 47, 48, 53, 56], 
    'jam': [20], 'black': [5], 'farmer': [11], 
    'woodchuck': [54], 'has': [14, 16, 51], 'who': [16] 
    } 

Мой код:

def sort_by_increasing_order(mylist, myDict): 
    #temp = sorted(myDict, key=myDict.get) 
    temp = sorted(myDict, key=lambda tempKey: for tempKey in mylist, reverse=True) 
    return temp 

Что-то вроде:

sort_by_increasing_order(['d', 'e', 'f'], {'d': [0, 1], 'e': [1, 2, 3], 'f': [4]}) 
    result: ['f', 'e', 'd'] 

Так что для моего ввода образца он будет выглядеть следующим образом:

 sort_by_increasing_order(mylist, myDict) 
     >> ['to','woodchuck','has','jam','who','farmer'] 

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

+0

Как вы сравниваете ключи? – Abhijit

+0

Вы не можете сортировать словарь по ключам. Словарь по определению не отсортирован. – sashkello

ответ

2

со ссылкой на @doukremt ответ если вы знаете о декораторов.

mydict = {'d': [0, 1], 'e': [1, 2, 3], 'f': [4]} 
mylist = [['d', 'e', 'f', 'c'], ['c', 'v', 'd', 'n']] 

def convert_to_set(mylist, result_set=None): 
    if result_set is None: 
     result_set = [] 
    for item in mylist: 
     if isinstance(item, str): 
      result_set.append(item) 
     if isinstance(item, list): 
      convert_to_set(item, result_set) 
    return set(result_set) 

def list_to_set(f): 
    def wrapper(mylist, mydict): 
     myset = convert_to_set(mylist) 
     result = f(myset, mydict) 
     return result 
    return wrapper 

@list_to_set 
def findit(mylist, mydict): 
    gen = ((k, mydict[k]) for k in mylist if k in mydict) 
    return [k for k, v in sorted(gen, key=lambda p: len(p[1]))] 

print findit(mylist, mydict) 
+0

Большое спасибо за ваш ответ. Позвольте мне попробовать. Мне жаль, что я не знаю декораторов. Если бы вы могли объяснить, что делает ваш код, это было бы здорово. – user3247054

+1

http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python/1594484#1594484 здесь –

+0

Спасибо. Позвольте мне попробовать. – user3247054

1
>>> D= {'to': [7, 11, 17, 23, 24, 25, 26, 33, 34, 37, 39, 41, 47, 48, 53, 56], 
...  'jam': [20], 'black': [5], 'farmer': [11], 
...  'woodchuck': [54], 'has': [14, 16, 51], 'who': [16] 
...  } 
>>> 
>>> sorted(D, key=lambda k:len(D[k]), reverse=True) 
['to', 'has', 'who', 'jam', 'black', 'farmer', 'woodchuck'] 

Для значений

>>> sorted(D.values(), key=len, reverse=True) 
[[7, 11, 17, 23, 24, 25, 26, 33, 34, 37, 39, 41, 47, 48, 53, 56], [14, 16, 51], [16], [20], [5], [11], [54]] 

Для (ключи, значения)

>>> sorted(D.items(), key=lambda i:len(i[1]), reverse=True) 
[('to', [7, 11, 17, 23, 24, 25, 26, 33, 34, 37, 39, 41, 47, 48, 53, 56]), ('has', [14, 16, 51]), ('who', [16]), ('jam', [20]), ('black', [5]), ('farmer', [11]), ('woodchuck', [54])] 

Edit: До сих пор не совсем понятно, что вы просите. Ваш пример, похоже, вообще не заботится о длине, иначе «есть» должно появиться до «woodchuck»? Изменение len к max может быть то, что вы хотите

>>> D = {'to': [7, 11, 17, 23, 24, 25, 26, 33, 34, 37, 39, 41, 47, 48, 53, 56], 
...  'jam': [20], 'black': [5], 'farmer': [11], 
...  'woodchuck': [54], 'has': [14, 16, 51], 'who': [16] 
...  } 
>>> 
>>> sorted(D, key=lambda k:max(D[k]), reverse=True) 
['to', 'woodchuck', 'has', 'jam', 'who', 'farmer', 'black'] 
>>> sorted(D.values(), key=max, reverse=True) 
[[7, 11, 17, 23, 24, 25, 26, 33, 34, 37, 39, 41, 47, 48, 53, 56], [54], [14, 16, 51], [20], [16], [11], [5]] 
>>> sorted(D.items(), key=lambda i:max(i[1]), reverse=True) 
[('to', [7, 11, 17, 23, 24, 25, 26, 33, 34, 37, 39, 41, 47, 48, 53, 56]), ('woodchuck', [54]), ('has', [14, 16, 51]), ('jam', [20]), ('who', [16]), ('farmer', [11]), ('black', [5])] 
+0

Спасибо за ваш ответ. Это возвращает ключи. Что делать, если я хочу вернуть значения? – user3247054

+0

Большое спасибо. Но это не сортировка по списку списков? – user3247054

+2

Извините, я не понимаю, о чем вы спрашиваете (возможно, здесь ничего нет). Можете ли вы уточнить свой вопрос с помощью надлежащего примера? –

1
def findit(mylist, mydict): 
    gen = ((k, mydict[k]) for k in mylist if k in mydict) 
    return [k for k, v in sorted(gen, key=lambda p: len(p[1]))] 


>>> findit(['d', 'e', 'f'], {'d': [0, 1], 'e': [1, 2, 3], 'f': [4]}) 
['f', 'd', 'e'] 
+0

Спасибо за ваш ответ. Но я получаю TypeError: unhashable type: 'list'. Если ваш делает в одном списке, в то время как у меня есть список списков, опубликованных выше. – user3247054

+0

@ user3247054: Затем вы должны либо преобразовать свои вложенные списки в кортежи, либо использовать другую структуру данных. Вы не можете искать списки в словарях – michaelmeyer

+0

любое предложение как? – user3247054

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