Skip to main content
 首页 » 编程设计

python之如何从 python 中所有组合列表中的索引中知道元素的组合

2025年05月04日10xiaohuochai

我有一些列表中的所有配对组合:

a = [1,2,3,4,5,6] 
pairs = [pair for pair in itertools.combinations(a,2)] 
print pairs 
 
>>>[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)] 

如果我只知道它的索引,我怎么知道我使用的到底是什么对? 也许有一些公式?问题是我的列表太大了,我不能记住所有的配对。我只需要一些我可以通过索引识别的特定对。

有什么建议吗?

谢谢!

请您参考如下方法:

这是一种直接从其索引生成对的方法。可能有一个更有效的方程式,但这是我几分钟后想出的。 :)

import itertools 
 
def pair_from_index(a, i): 
    m = n = len(a) - 1 
    while i >= n: 
        i -= n 
        n -= 1 
    m -= n 
    return a[m], a[m + i + 1] 
 
# test 
 
a = list('abcdefg') 
 
for i, t in enumerate(itertools.combinations(a, 2)): 
    print(i, t, pair_from_index(a, i)) 

输出

0 ('a', 'b') ('a', 'b') 
1 ('a', 'c') ('a', 'c') 
2 ('a', 'd') ('a', 'd') 
3 ('a', 'e') ('a', 'e') 
4 ('a', 'f') ('a', 'f') 
5 ('a', 'g') ('a', 'g') 
6 ('b', 'c') ('b', 'c') 
7 ('b', 'd') ('b', 'd') 
8 ('b', 'e') ('b', 'e') 
9 ('b', 'f') ('b', 'f') 
10 ('b', 'g') ('b', 'g') 
11 ('c', 'd') ('c', 'd') 
12 ('c', 'e') ('c', 'e') 
13 ('c', 'f') ('c', 'f') 
14 ('c', 'g') ('c', 'g') 
15 ('d', 'e') ('d', 'e') 
16 ('d', 'f') ('d', 'f') 
17 ('d', 'g') ('d', 'g') 
18 ('e', 'f') ('e', 'f') 
19 ('e', 'g') ('e', 'g') 
20 ('f', 'g') ('f', 'g') 

这是一个改进版本,在处理长度为 500 的列表时比之前的版本快大约 10 倍,而且在处理更大的列表时应该会更高效。

def pair_from_index(a, i): 
    n = len(a) - 1 
    m = n * (n + 1) // 2 
    y = m - i - 1 
    d = 1 + int(((8*y + 1) ** 0.5 - 1) / 2) 
    k = n - d 
    return a[k], a[1 + i + k + d * (d + 1) // 2 - m] 

我不会尝试完全解释它是如何工作的,但它使用 triangular numbers .

令 T(x) 为第 x 个三角数,即从 1 到 x 的数字之和。 T(x) 的公式很简单:

T(x) = x * (x + 1) / 2 

给定 y = T(x) 我们可以通过反转上面的公式来计算 x

x = (8*y + 1) ** 0.5 - 1) / 2