Понимание словаря для построения списка списков: ссылка на текущее значение ключа во время понимания

Я пытаюсь создать список списков на основе хэшей. То есть мне нужен список списков элементов, которые хэшируют одинаково. Возможно ли это в понимании одной строки?

Вот простой код, который работает без понимания:

def list_of_lists(items):
    items_by_hash = defaultdict(list)
    for item in items:
        words_by_key[hash(item)].append(item)
    return words_by_key.values()

Например, допустим, у нас есть эта простая хеш-функция:

def hash(string):
    import __builtin__
    return __builtin__.hash(string) % 10

Затем,

>>> l = ['sam', 'nick', 'nathan', 'mike']
>>> [hash(x) for x in l]
[4, 3, 2, 2]
>>>
>>> list_of_lists(l)
[['nathan', 'mike'], ['nick'], ['sam']] 

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

Это лучшее, что у меня есть, но оно не работает:

>>> { hash(word) : [word] for word in l }.values()
[['mike'], ['nick'], ['sam']]

Очевидно, каждый раз создается новый список, а это не то, что я хочу. Я хочу что-то вроде

{ hash(word) : __this__[hash(word)] + [word] for word in l }.values()

или же

>>> dict([ (hash(word), word) for word in l ])
{2: 'mike', 3: 'nick', 4: 'sam'}

но это вызывает ту же проблему.

1 ответ

Решение
[[y[1] for y in x[1]] for x in itertools.groupby(sorted((hash(y), y)
  for y in items), operator.itemgetter(0))]
Другие вопросы по тегам