Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据特定键/值对对词典列表进行聚类_Python_Python 3.x_List_Dictionary - Fatal编程技术网

Python 根据特定键/值对对词典列表进行聚类

Python 根据特定键/值对对词典列表进行聚类,python,python-3.x,list,dictionary,Python,Python 3.x,List,Dictionary,假设我有一个字典列表,所有字典都有相同的键。我想把它们重新组合成几个列表,这样我选择的某些属性的值是相等的。以下是一个例子: 假设我有以下词典列表: [ {'a': 0.0, 'b': 0.2, 'c': 0.1}, {'a': 0.1, 'b': 0.7, 'c': 0.2}, {'a': 0.0, 'b': 0.2, 'c': 0.3}, {'a': 0.1, 'b': 0.7, 'c': 0.4}, {'a': 0.0, 'b': 0.7, 'c': 0.5},

假设我有一个字典列表,所有字典都有相同的键。我想把它们重新组合成几个列表,这样我选择的某些属性的值是相等的。以下是一个例子:

假设我有以下词典列表:

[  {'a': 0.0, 'b': 0.2, 'c': 0.1},
   {'a': 0.1, 'b': 0.7, 'c': 0.2},
   {'a': 0.0, 'b': 0.2, 'c': 0.3},
   {'a': 0.1, 'b': 0.7, 'c': 0.4},
   {'a': 0.0, 'b': 0.7, 'c': 0.5},
   {'a': 0.0, 'b': 0.7, 'c': 0.6}]
 [[{'a': 0.0, 'b': 0.2, 'c': 0.1},
   {'a': 0.0, 'b': 0.2, 'c': 0.3}]

   [{'a': 0.1, 'b': 0.7, 'c': 0.2},
    {'a': 0.1, 'b': 0.7, 'c': 0.4}]

   [{'a': 0.0, 'b': 0.7, 'c': 0.5},
    {'a': 0.0, 'b': 0.7, 'c': 0.6}]]
我想根据a键和b键对它进行聚类。然后,输出将是以下词典列表:

[  {'a': 0.0, 'b': 0.2, 'c': 0.1},
   {'a': 0.1, 'b': 0.7, 'c': 0.2},
   {'a': 0.0, 'b': 0.2, 'c': 0.3},
   {'a': 0.1, 'b': 0.7, 'c': 0.4},
   {'a': 0.0, 'b': 0.7, 'c': 0.5},
   {'a': 0.0, 'b': 0.7, 'c': 0.6}]
 [[{'a': 0.0, 'b': 0.2, 'c': 0.1},
   {'a': 0.0, 'b': 0.2, 'c': 0.3}]

   [{'a': 0.1, 'b': 0.7, 'c': 0.2},
    {'a': 0.1, 'b': 0.7, 'c': 0.4}]

   [{'a': 0.0, 'b': 0.7, 'c': 0.5},
    {'a': 0.0, 'b': 0.7, 'c': 0.6}]]

实现这一点的最佳方法是什么?

首先对其进行排序,然后使用
itertools.groupby
。您可以尝试以下方法:

from itertools import groupby

t = [{'a': 0.0, 'b': 0.2, 'c': 0.1},
     {'a': 0.1, 'b': 0.7, 'c': 0.2},
     {'a': 0.0, 'b': 0.2, 'c': 0.3},
     {'a': 0.1, 'b': 0.7, 'c': 0.4},
     {'a': 0.0, 'b': 0.7, 'c': 0.5},
     {'a': 0.0, 'b': 0.7, 'c': 0.6}]

print([[*j] for i, j in groupby(sorted(t, key=lambda x: (x['a'], x['b'])), key=lambda x: (x['a'], x['b']))])
结果:

[[{'a': 0.0, 'b': 0.2, 'c': 0.1}, {'a': 0.0, 'b': 0.2, 'c': 0.3}], [{'a': 0.0, 'b': 0.7, 'c': 0.5}, {'a': 0.0, 'b': 0.7, 'c': 0.6}], [{'a': 0.1, 'b': 0.7, 'c': 0.2}, {'a': 0.1, 'b': 0.7, 'c': 0.4}]]
如果要创建接收多个键的函数,可以尝试:

from itertools import groupby

def group_by(*args):
    return [[*j] for i, j in groupby(sorted(t, key=itemgetter(*args)), key=itemgetter(*args))]


t = [{'a': 0.0, 'b': 0.2, 'c': 0.1},
     {'a': 0.1, 'b': 0.7, 'c': 0.2},
     {'a': 0.0, 'b': 0.2, 'c': 0.3},
     {'a': 0.1, 'b': 0.7, 'c': 0.4},
     {'a': 0.0, 'b': 0.7, 'c': 0.5},
     {'a': 0.0, 'b': 0.7, 'c': 0.6}]

print(group_by('a', 'b'))

@cyrus您可以使用
*args
接收它们,并使用列表理解创建筛选器。我已经更新了答案。