加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

根据重叠项将Python列表分组到组中

发布时间:2020-12-20 11:27:08 所属栏目:Python 来源:网络整理
导读:我有一个列表列表,我试图根据他们的项目对它们进行分组或聚类.如果上一组中没有元素,嵌套列表将启动一个新组. 输入: paths = [ ['D','B','A','H'],['D','C'],['H',['E','G','I'],['F','I']] 我失败的代码: paths = [ ['D','I']]groups = []paths_clone = p
我有一个列表列表,我试图根据他们的项目对它们进行分组或聚类.如果上一组中没有元素,嵌套列表将启动一个新组.

输入:

paths = [  
        ['D','B','A','H'],['D','C'],['H',['E','G','I'],['F','I']]

我失败的代码:

paths = [
    ['D','I']
]
groups = []
paths_clone = paths
for path in paths:
    for node in path:
        for path_clone in paths_clone:
            if node in path_clone:
                if not path == path_clone:
                    groups.append([path,path_clone])
                else:
                    groups.append(path)
print groups

预期产出:

[
 [
  ['D','C']
 ],[
  ['E','I']
 ]
]

另一个例子:

paths = [['shifter','barrel','barrel shifter'],['ARM',['IP power','IP','power'],'shifter']]

预期产出组:

output = [
         [['shifter','shifter']],[['IP power','power']],]

解决方法

您正在基于集合进行分组,因此使用集合来检测新组:

def grouper(sequence):
    group,members = [],set()

    for item in sequence:
        if group and members.isdisjoint(item):
            # new group,yield and start new
            yield group
            group,set()
        group.append(item)
        members.update(item)

    yield group

这给出了:

>>> for group in grouper(paths):
...     print group
... 
[['D','C']]
[['E','I']]

或者您可以再次将其强制转换为列表:

output = list(grouper(paths))

这假设这些组是连续的.如果您有不相交的组,则需要处理整个列表并循环遍历为每个项目构建的所有组:

def grouper(sequence):
    result = []  # will hold (members,group) tuples

    for item in sequence:
        for members,group in result:
            if members.intersection(item):  # overlap
                members.update(item)
                group.append(item)
                break
        else:  # no group found,add new
            result.append((set(item),[item]))

    return [group for members,group in result]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读