如何创建一个字典,其键是 (i,j) 整数对且 i < j
how to create a dictionary whose keys are (i,j) integer pairs with i < j
我打算创建数千个整数对,对它们进行编号并将它们存储在字典中。给定一个数字 n
,我的目标是生成每个 (i,j)
对,使得 i<j
.
例如,如果 n=4
,那么字典将看起来像 {(0, 1): 0, (0, 2): 1, (0, 3): 2, (1, 2): 3, (1, 3): 4, (2, 3): 5}
。
我可以使用嵌套的 for 循环生成这个字典,但是当 n
很大时效率不高。有人可以帮助我比现在更快地执行此操作吗?
d={}
n=4
temp =0
for i in range(n):
for j in range(n):
if i <j:
d.update({(i,j): temp})
temp+= 1
这对 itertools.combinations
来说是完美的工作,因为它只会产生所需的组合:
from itertools import combinations
n = 4
out = {k:v for v,k in enumerate(combinations(range(n), 2))}
输出:{(0, 1): 0, (0, 2): 1, (0, 3): 2, (1, 2): 3, (1, 3): 4, (2, 3): 5}
使用您的代码
请注意,您可以修改代码以仅生成所需的组合:
d={}
n=4
temp = 0
for j in range(n):
for i in range(j):
d[(i,j)] = temp
temp += 1
# {(0, 1): 0, (0, 2): 1, (1, 2): 2, (0, 3): 3, (1, 3): 4, (2, 3): 5}
更进一步:
from itertools import combinations, count
n = 4
out = dict(zip(combinations(range(n), 2), count()))
好像稍微快点。测试 n = 1000:
191.0 ms mozway
176.2 ms kelly
186.8 ms mozway
177.8 ms kelly
185.2 ms mozway
178.6 ms kelly
代码(Try it online!):
from timeit import repeat
from itertools import combinations, count
def mozway():
return {k:v for v,k in enumerate(combinations(range(n), 2))}
def kelly():
return dict(zip(combinations(range(n), 2), count()))
n = 1000
for func in [mozway, kelly] * 3:
t = min(repeat(func, number=1))
print('%5.1f ms ' % (t * 1e3), func.__name__)
我打算创建数千个整数对,对它们进行编号并将它们存储在字典中。给定一个数字 n
,我的目标是生成每个 (i,j)
对,使得 i<j
.
例如,如果 n=4
,那么字典将看起来像 {(0, 1): 0, (0, 2): 1, (0, 3): 2, (1, 2): 3, (1, 3): 4, (2, 3): 5}
。
我可以使用嵌套的 for 循环生成这个字典,但是当 n
很大时效率不高。有人可以帮助我比现在更快地执行此操作吗?
d={}
n=4
temp =0
for i in range(n):
for j in range(n):
if i <j:
d.update({(i,j): temp})
temp+= 1
这对 itertools.combinations
来说是完美的工作,因为它只会产生所需的组合:
from itertools import combinations
n = 4
out = {k:v for v,k in enumerate(combinations(range(n), 2))}
输出:{(0, 1): 0, (0, 2): 1, (0, 3): 2, (1, 2): 3, (1, 3): 4, (2, 3): 5}
使用您的代码
请注意,您可以修改代码以仅生成所需的组合:
d={}
n=4
temp = 0
for j in range(n):
for i in range(j):
d[(i,j)] = temp
temp += 1
# {(0, 1): 0, (0, 2): 1, (1, 2): 2, (0, 3): 3, (1, 3): 4, (2, 3): 5}
更进一步:
from itertools import combinations, count
n = 4
out = dict(zip(combinations(range(n), 2), count()))
好像稍微快点。测试 n = 1000:
191.0 ms mozway
176.2 ms kelly
186.8 ms mozway
177.8 ms kelly
185.2 ms mozway
178.6 ms kelly
代码(Try it online!):
from timeit import repeat
from itertools import combinations, count
def mozway():
return {k:v for v,k in enumerate(combinations(range(n), 2))}
def kelly():
return dict(zip(combinations(range(n), 2), count()))
n = 1000
for func in [mozway, kelly] * 3:
t = min(repeat(func, number=1))
print('%5.1f ms ' % (t * 1e3), func.__name__)