Вы можете сделать это следующим образом :
>>> import collections
>>> mylist = [('a',1),('a',2),('a',3),('b',1),('b',2),('b',3)]
>>> result = collections.defaultdict(list)
>>> for item in mylist:
result[item[0]].append(item[1])
>>> dict(result)
{'a': [1, 2, 3], 'b': [1, 2, 3]}
defaultdict(list)
создает словарь, в котором ключи инициализируются при первом доступе к объекту, созданным с помощью вызываемому передаются в качестве аргумента (в данном случае list
). Это позволяет избежать проверки наличия ключа или нет.
Последняя строка преобразует defaultdict
в нормальный dict
- это не является абсолютно необходимым, так как defaultdict
ведет себя как обычный словарь.
Значения прилагаются к каждой клавише в том же порядке, что и исходный список. Однако сами ключи не будут упорядочены (это свойство словарей).
Update: если вам нужны ключи словаря оставаться отсортирован, а также, вы можете сделать это:
>>> import collections
>>> mylist = [('a',1),('a',2),('c',1),('c',2),('b',1),('b',2)]
>>> result = collections.OrderedDict()
>>> for item in mylist:
if item[0] not in result:
result[item[0]] = list()
result[item[0]].append(item[1])
>>> result
OrderedDict([('a', [1, 2]), ('c', [1, 2]), ('b', [1, 2])])
>>> result.keys()
['a', 'c', 'b']
Очевидно, что вы не можете использовать dict(result)
в этом случае dict
не поддерживает какой-либо конкретный порядок клавиш.
thx для вашего ответа, на самом деле я знал этот метод, образец, который я дал сейчас, не так уж и правилен. Попробуйте этот образец и проверьте, все ли отсортированный список словаря = [('&', 9), ('&', 10), ("'s", 10), (' (', 5), (' (6), (')', 5), (')', 6), ('+ bahia', 1), (',', 1), (',', 5), (',' , 6), (',', 9), (',', 10), ('-', 5), ('-', 5), ('.', 1), ('.', 5), ('.', 6), ('.', 9), ('.', 10), ('.125', 10), ('0,39', 1), ('0,99', 5), ('1', 9), ('1,655,8', 6), ('1750', 1), ('1780', 1), ('1850', 1), ('1870', 1) ('1,875', 1), ('1,880', 1), ('1,06', 1), ('1.24', 5)] – xlk3099
ах, вы хотите, чтобы словарные ключи оставались отсортированными? Обновит ответ тогда ... – isedev
это действительно приятно, thx много :). – xlk3099