词典字典:共享至少两个公共键的打印词典

如何解决词典字典:共享至少两个公共键的打印词典

||
d = {\'g1\':{\'p1\':1,\'p2\':5,\'p3\':11,\'p4\':1},\'g2\':{\'p1\':7,\'p3\':1,\'p4\':2,\'p5\':8,\'p9\':11},\'g3\':{\'p7\':7,\'p8\':7},\'g4\':{\'p8\':9,\'p9\':1,\'p10\':7,\'p11\':8,\'p12\':3},\'g5\':{\'p1\':4,\'p13\':1},\'g6\':{\'p1\':4,\'p6\':2,\'p13\':1}
    }
对于给定的词典\'d \',我想返回共享至少两个(\'n \')键(存在于给定群集的所有子词典中)的子词典的群集。在这里,我们不在乎这些子词典的值。换句话说,给定群集中所有子词典的键的交集长度应至少为两个(或'n')。     

解决方法

        我希望我正确理解了你想要什么。这种方法笨拙,我担心它的效率很低。 我向d添加了字典g6以便产生更有趣的输出:
#! /usr/bin/env python
# -*- coding: utf-8 -*-

d = {\'g1\':{\'p1\':1,\'p2\':5,\'p3\':11,\'p4\':1},\'g2\':{\'p1\':7,\'p3\':1,\'p4\':2,\'p5\':8,\'p9\':11},\'g3\':{\'p7\':7,\'p8\':7},\'g4\':{\'p8\':9,\'p9\':1,\'p10\':7,\'p11\':8,\'p12\':3},\'g5\':{\'p1\':4,\'p13\':1},\'g6\':{\'p1\':1,\'p9\':2,\'p11\':12}
    }

clusters = {}

for key,value in d.items ():
    cluster = frozenset (value.keys () )
    if cluster not in clusters: clusters [cluster] = set ()
    clusters [cluster].add (key)


for a in clusters.keys ():
    for b in clusters.keys ():
        if len (a & b) > 1 and a ^ b:
            cluster = frozenset (a & b)
            if cluster not in clusters: clusters [cluster] = set ()
            for x in clusters [a]: clusters [cluster].add (x)
            for x in clusters [b]: clusters [cluster].add (x)

print \"Primitive clusters\"
for key,value in filter (lambda (x,y): len (y) == 1,clusters.items () ):
    print \"The dictionary %s has the keys %s\" % (value.pop (),\",\".join (key) )

print \"---------------------\"
print \"Non-primitive clusters:\"
for key,y): len (y) > 1,clusters.items () ):
    print \"The dictionaries %s share the keys %s\" % (\",\".join (value),\".join (key) )
    ,        我认为您应该先“倒置”字典,然后找到解决方案很容易:
import collections
inverted = collections.defaultdict(list)

for key,items in d.items():
    for sub_key in items:
        inverted[sub_key].append(key)

for sub_key,keys in inverted.items():
    if len(keys) >= 2:
        print sub_key,keys
    ,        就像是
for keya in d:
    tempd = {}
    keys = set()
    tempset = set(d[keya].keys())

    for keyb in d:
        tempset &= d[keyb].keys()

        if len(tempset) >= 2:
            keys.add(keyb)

    print({key: d[key] for key in keys})
可能会工作。 编辑:不,不是很有效。我需要考虑一下。     ,        如果将问题简化为仅长度为2的簇(即,成对的字典),它将变得更加清晰:从给定的可迭代对象生成固定长度的子序列正是itertools.combinations的工作:
>>> list(itertools.combinations(d,2))
[(\'g5\',\'g4\'),(\'g5\',\'g3\'),\'g2\'),\'g1\'),(\'g4\',\'g
2\'),(\'g3\',(\'g2\',\'g1\')]
通过意识到视图d.keys()的行为类似于集合(在Python 3中;在Python 2中,它可能是一个列表),我们可以看到任何词典共有的键数:
>>> d[\'g1\'].keys() & d[\'g2\'].keys()
{\'p3\',\'p1\',\'p4\'}
&是集合的交集运算符-它为我们提供了这些集合共有的所有项目的集合。因此,我们可以通过检查此集合的长度来检查其中是否有至少两个,从而得出:
>>> common_pairs = [[x,y] for x,y in itertools.combinations(d,2)
                                   if len(d[x].keys() & d[y].keys()) >= 2]
>>> common_pairs
[[\'g2\',\'g1\']]
解决未知的群集大小会稍微困难一些-如果我们不对此进行硬编码,则无法直接使用&运算符。幸运的是,set类为我们提供了一种以set.intersection形式获取n个集合的交集的方法。它不会接受dict_keys实例,但是您可以通过调用set来轻松解决该问题:
>>> set.intersection(d[\'g1\'].keys(),d[\'g2\'].keys(),d[\'g5\'].keys())
Traceback (most recent call last):
  File \"<stdin>\",line 1,in <module>
TypeError: descriptor \'intersection\' requires a \'set\' object but received a \'dict_keys\'
>>> set.intersection(set(d[\'g1\']),set(d[\'g1\']),set(d[\'g5\']))
{\'p1\'}
您应该能够相当轻松地将其概括为大小为2到n的群集。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-