liz*_*eta 2 python combinations python-itertools
我有一些列表中的所有对组合:
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)]
Run Code Online (Sandbox Code Playgroud)
如果我只知道它的索引,我如何知道我到底在使用哪个对?也许有一些公式?问题是我的列表太大了,我无法记住所有对。我只需要一些可以通过索引识别的特定对。
有什么建议么?
谢谢!
这是直接从索引生成一对的方法。可能有一个更有效的方程式,但这是我几分钟后想出的。:)
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))
Run Code Online (Sandbox Code Playgroud)
输出
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')
Run Code Online (Sandbox Code Playgroud)
这是一个改进的版本,在长度为 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]
Run Code Online (Sandbox Code Playgroud)
我不会尝试完全解释它是如何工作的,但它使用三角形数字。
令T(x)为第x个三角数,即从1到x的数之和。T(x) 的公式很简单:
T(x) = x * (x + 1) / 2
Run Code Online (Sandbox Code Playgroud)
给定 y = T(x),我们可以通过反转上面的公式来计算 x
x = (8*y + 1) ** 0.5 - 1) / 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
608 次 |
| 最近记录: |