如何解决按列表中的特定键对字典项进行分组
我有以下示例列表:
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.collapsingtoolbar_and_recyclerview)
val mCoordinatorLayout = findViewById<CoordinatorLayout>(R.id.myCoordinatorLayout)
val mCollapsingToolbarLayout = findViewById<CollapsingToolbarLayout>(R.id.myCollapsingToolbarLayout)
val mToolbar = findViewById<MaterialToolbar>(R.id.myToolbar)
// ...Do other stuff here
setActionBar(mCollapsingToolbarLayout)
mCollapsingToolbarLayout.title = "Hello,world!"
}
}
我想将字典项的名称值与共享相同“数据”值的项的其他名称值分组。
因此,对于这个特定示例,我想获得以下结果:
my_list = [
{
'data': {
'color': 'white'
},'name': 'item1'
},{
'data': {
'color': 'white','property': 'value1'
},'name': 'item2'
},'name': 'item3'
},{
'data': {
'color': 'black','name': 'item4'
},'property': 'value1','custom': 'valueA'
},'name': 'item5'
},{
'data': {
'color': 'white'
},'name': 'item6'
},]
根据要求更新: 我尝试使用groupby分隔它们,但没有成功:
result = [('item1','item6'),('item2','item3')]
解决方法
out = {}
for d in my_list:
out.setdefault(tuple(d['data'].items()),[]).append(d['name'])
out = [v for v in out.values() if len(v) > 1]
print(out)
打印:
[['item1','item6'],['item2','item3']]
,
您可以使用itertools.groupby
from itertools import groupby
keyfunc = lambda x: sorted(zip(x['data'].keys(),x['data'].values()))
ls = sorted(my_list,key = keyfunc)
groups = []
for k,g in groupby(ls,keyfunc):
groups.append([n['name'] for n in g])
>>> groups
[['item4'],['item1',['item5'],'item3']]
样品运行:
>>> sorted(map(keyfunc,my_list))
[[('color','black'),('property','value1')],[('color','white')],'white'),('custom','valueA'),'value1')]]
>>> ls
[{'data': {'color': 'black','property': 'value1'},'name': 'item4'},{'data': {'color': 'white'},'name': 'item1'},'name': 'item6'},{'data': {'color': 'white','property': 'value1','custom': 'valueA'},'name': 'item5'},'name': 'item2'},'name': 'item3'}]
备注:itertools.groupby
中的组只能包含一个项目。您可以将它们与:
>>> [n for n in groups if len(n) > 1]
[['item1','item3']]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。