微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何可读且有效地创建一个可迭代组合字典,并以其索引的元组为键?

如何解决如何可读且有效地创建一个可迭代组合字典,并以其索引的元组为键?

所以我有一些有效的代码,但充其量很难阅读,而且我觉得效率低下,因为它使用了两个列表推导式,其中一个就足够了。

我需要的是创建一个包含 n 中字母的所有 alpha 组合的字典,每个项目的字典键是 alpha 中索引的元组对于组合中的元素。这应该适用于任何 n:

n=2

from itertools import combinations 

alpha = "abcde" 
n = 2

D = {tuple([c_i[0] for c_i in comb]): tuple([c_i[1] for c_i in comb]) 
     for comb in combinations(enumerate(alpha),n)}

>>>{(0,1): ('a','b'),(0,2): ('a','c'),3): ('a','d'),4): ('a','e'),(1,2): ('b',3): ('b',4): ('b',(2,3): ('c',4): ('c',(3,4): ('d','e')}

n=3

from itertools import combinations 

alpha = "abcde" 
n = 3

D = {tuple([c_i[0] for c_i in comb]): tuple([c_i[1] for c_i in comb]) 
     for comb in combinations(enumerate(alpha),1,'b',2,'c',3,'d','e')}

这是按预期工作,但我想知道是否有更易读的实现,或者我不需要对 [c_i[0] for c_i in comb] 和 {{1 进行单独理解的实现}} 因为这感觉效率低下。

注意:这是一个更复杂问题的最小案例表示,其中 [c_i[1] for c_i in comb] 的元素是昂贵函数的参数,我想将 alpha输出存储在字典中以便于无需重新计算的查找:f(alpha[i],alpha[j],alpha[k])

解决方法

避免看似冗余的元组键值形成的一种方法是将 zipassignment expression 一起使用:

from itertools import combinations 
alpha = "abcde" 
n = 2
D = {(k:=list(zip(*comb)))[0]:k[1] for comb in combinations(enumerate(alpha),n)}

输出:

{(0,1): ('a','b'),(0,2): ('a','c'),3): ('a','d'),4): ('a','e'),(1,2): ('b',3): ('b',4): ('b',(2,3): ('c',4): ('c',(3,4): ('d','e')}
,

试试这个:(我觉得它比另一个答案简单得多,但那个也很好用)

from itertools import combinations 

alpha = "abcde" 
n = 2

print({key: tuple([alpha[i] for i in key]) for key in combinations(range(len(alpha)),n)})

输出:

{(0,'e')}

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?