根据某个特征对对象列表进行分组

时间:2011-04-28 16:13:15

标签: list dictionary python list-comprehension

我有一个对象列表(本例中的字符串),我想根据函数返回的某个特征对其进行分类。

例如,请考虑以下列表:

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

和一个函数color(item),它返回传递给它的字符串的颜色,例如color('sky')返回'blue'。我现在想要将列表转换为字典或列表列表,这些列表根据项目的颜色/函数返回的值对项目进行分组。可能的结果如下所示:

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

我不关心密钥本身,只是相应地对项目进行分组,因此嵌套列表也可以。试着以pythonic方式做到这一点:)

3 个答案:

答案 0 :(得分:5)

我想我会这样回答这个问题:

from collections import defaultdict

D = defaultdict(list)

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

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

它为您提供了一个按颜色键入的列表字典,其中包含该类别的项目。

答案 1 :(得分:0)

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版本中,您可以使用默认字典来使循环核心更清晰。

答案 2 :(得分:0)

稍微修改解决方案'展开'已提出:

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

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']}