일부 목록에서 모든 쌍 조합이 있습니다.
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]
어떻게 작동하는지 완전히 설명하지는 않겠지 만 삼각수를 사용 합니다 .
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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다