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

标签 python combinations itertools dictionary-comprehension

所以我有一些有效的代码,但它充其量难以阅读,而且我觉得效率低下,因为它使用了两个列表理解,其中一个就足够了。
我需要的是创建一个包含所有 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'),
 (0, 3): ('a', 'd'),
 (0, 4): ('a', 'e'),
 (1, 2): ('b', 'c'),
 (1, 3): ('b', 'd'),
 (1, 4): ('b', 'e'),
 (2, 3): ('c', 'd'),
 (2, 4): ('c', 'e'),
 (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), n)}

>>>{(0, 1, 2): ('a', 'b', 'c'),
 (0, 1, 3): ('a', 'b', 'd'),
 (0, 1, 4): ('a', 'b', 'e'),
 (0, 2, 3): ('a', 'c', 'd'),
 (0, 2, 4): ('a', 'c', 'e'),
 (0, 3, 4): ('a', 'd', 'e'),
 (1, 2, 3): ('b', 'c', 'd'),
 (1, 2, 4): ('b', 'c', 'e'),
 (1, 3, 4): ('b', 'd', 'e'),
 (2, 3, 4): ('c', 'd', 'e')}
这是按预期工作 ,但我想知道是否有更易读的实现,或者我不需要单独理解 [c_i[0] for c_i in comb] 的实现。和 [c_i[1] for c_i in comb]因为这感觉效率低下。
注意:这是更复杂问题的最小案例表示,其中 alpha 的元素是昂贵函数的参数,我想存储 f(alpha[i], alpha[j], alpha[k]) 的输出在字典中以便于查找而无需重新计算:ans = D[(i, j, k)]

最佳答案

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

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, 1): ('a', 'b'), (0, 2): ('a', 'c'), (0, 3): ('a', 'd'), (0, 4): ('a', 'e'), (1, 2): ('b', 'c'), (1, 3): ('b', 'd'), (1, 4): ('b', 'e'), (2, 3): ('c', 'd'), (2, 4): ('c', 'e'), (3, 4): ('d', 'e')}

关于python - 如何可读且有效地创建一个可迭代组合字典,并以其索引的元组为键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68119411/

相关文章:

python - Itertools zip_longest 将每个子列表的第一项作为填充值而不是默认情况下的 None

python - 如何在Python中改善列表上的模式匹配

python - 整数乘以分数和小数时Python程序出错

python - re.sub匹配带有特殊符号的多词表达

php - 数组中值的排列

php - 所有子数组元素无重复的组合

algorithm - 速配算法

python - 具有重叠值的列表的排列

python - psycopg2 在/tmp 上的权限被拒绝

python - 无法使用kafka-python从另一个容器向Kafka容器发出请求