所以我有一些有效的代码,但它充其量难以阅读,而且我觉得效率低下,因为它使用了两个列表理解,其中一个就足够了。
我需要的是创建一个包含所有 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=3from 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/