группировка списка объектов по определенной характеристике - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть список объектов (в этом примере строки), которые я хочу классифицировать в соответствии с определенной характеристикой, возвращаемой функцией.

Например, рассмотрим следующий список:

['sky', 'ocean', 'grass', 'tomato', 'leaf']

и функция color(item), которая возвращает цвет переданной ей строки, например, color('sky') возвращает 'blue'. Теперь я хочу преобразовать список в словарь или список списков, который группирует элементы в соответствии с их цветом / значением, возвращаемым функцией. Возможный результат будет выглядеть так:

{ 
    'blue': ['sky', 'ocean'],
    'green': ['grass', 'leaf'],
    'red': ['tomato']
}

Мне не важен сам ключ, только то, что элементы сгруппированы соответственно, поэтому вложенные списки тоже подойдут. Просто пытаюсь сделать это питонским способом:)

Ответы [ 3 ]

5 голосов
/ 28 апреля 2011

Думаю, я бы решил этот вопрос следующим образом:

from collections import defaultdict

D = defaultdict(list)

a = ['sky', 'ocean', 'grass', 'tomato', 'leaf']

for item in a:
  D[color(item)].append(item)

Это дает вам словарь списков, выделенных цветами, который содержит элементы для этой категории.

0 голосов
/ 28 апреля 2011

Немного изменив решение, предложенное в "unwind":

</p> <pre><code>a = ['sky', 'ocean', 'grass', 'tomato', 'leaf'] def color(x): # dummy hash function for demo return len(x) color_map = {} for x in a: key = color(x) color_map.setdefault(key,[]).append(x) print color_map

Приведенный выше пример кода печатает:

{3: ['sky'], 4: ['leaf'], 5: ['ocean', 'grass'], 6: ['tomato']}
0 голосов
/ 28 апреля 2011
a = ['sky', 'ocean', 'grass', 'tomato', 'leaf']

sa = {}
for x in a:
  key = color(x)
  if key in sa:
    sa[key].append(x)
  else:
    sa[key] = [x]

Не уверен, насколько это pythonic, но это довольно ясно. В достаточно поздних версиях Python вы можете использовать словарь по умолчанию, чтобы очистить ядро ​​цикла.

...