如何解决如何可读且有效地创建一个可迭代组合字典,并以其索引的元组为键?
所以我有一些有效的代码,但充其量很难阅读,而且我觉得效率低下,因为它使用了两个列表推导式,其中一个就足够了。
我需要的是创建一个包含 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])
解决方法
避免看似冗余的元组键值形成的一种方法是将 zip
与 assignment 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 举报,一经查实,本站将立刻删除。