Разделить список имен в алфавитный словарь, в Python - PullRequest
3 голосов
/ 30 октября 2010

Список.

['Chrome', 'Chromium', 'Google', 'Python']

Результат.

{'C': ['Chrome', 'Chromium'], 'G': ['Google'], 'P': ['Python']}

Я могу заставить его работать так.

alphabet = dict()
for name in ['Chrome', 'Chromium', 'Google', 'Python']:
  character = name[:1].upper()
  if not character in alphabet:
    alphabet[character] = list()
  alphabet[character].append(name)

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

Есть ли pythonic способ сделать это?

Ответы [ 2 ]

9 голосов
/ 30 октября 2010

Что-то не так с этим? Я согласен с Антуаном, решение oneliner довольно загадочно.

import collections

alphabet = collections.defaultdict(list)
for word in words:
    alphabet[word[0].upper()].append(word)
5 голосов
/ 30 октября 2010

Я не знаю, является ли это Pythonic, но он более лаконичен:

import itertools
def keyfunc(x):
   return x[:1].upper()
l = ['Chrome', 'Chromium', 'Google', 'Python']
l.sort(key=keyfunc)
dict((key, list(value)) for (key,value) in itertools.groupby(l, keyfunc))

EDIT 2 сделал его менее лаконичным, чем предыдущая версия, более читабельным и более правильным (groupby работает как задумано только в отсортированных списках)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...