Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python的数据结构选择_Python_Data Structures - Fatal编程技术网

python的数据结构选择

python的数据结构选择,python,data-structures,Python,Data Structures,我有一个大约10000个元素的列表,对于这个列表中的每一对元素组合,我有一个数字。我需要在内存中存储所有这些数字和组合,以便通过两种变体调用它:comb(a,b)或comb(b,a) 但是,我不想在dictionary或类似的东西中复制值,因为dict[a][b]=dict[b][a]。你能给我一个没有重复的数据结构吗?我建议你使用冷冻套装。更多文档: 所以您将有一个dict,其中frozenset将充当键(请注意,您不能使用正则集,因为它是可变的,不能充当字典键)。 Frozenset是无序

我有一个大约10000个元素的列表,对于这个列表中的每一对元素组合,我有一个数字。我需要在内存中存储所有这些数字和组合,以便通过两种变体调用它:
comb(a,b)
comb(b,a)


但是,我不想在dictionary或类似的东西中复制值,因为
dict[a][b]=dict[b][a]
。你能给我一个没有重复的数据结构吗?

我建议你使用
冷冻套装。更多文档:

所以您将有一个dict,其中frozenset将充当键(请注意,您不能使用正则集,因为它是可变的,不能充当字典键)。 Frozenset是无序的,因此它完全符合您的需要。唯一的限制是不能复制元素-冻结集是唯一元素的无序序列

因此,您的dict将如下所示:

pairs = {
frozenset(['a', 'b']): 4
....
}
调用
pairs[frozenset(['a','b'])]
等于
pairs[frozenset(['b','a'])]


UPD:一开始我真的很匆忙,所以打了几个错字。现在已修复:)

我建议您使用
frozenset
。更多文档:

所以您将有一个dict,其中frozenset将充当键(请注意,您不能使用正则集,因为它是可变的,不能充当字典键)。 Frozenset是无序的,因此它完全符合您的需要。唯一的限制是不能复制元素-冻结集是唯一元素的无序序列

因此,您的dict将如下所示:

pairs = {
frozenset(['a', 'b']): 4
....
}
调用
pairs[frozenset(['a','b'])]
等于
pairs[frozenset(['b','a'])]

UPD:一开始我真的很匆忙,所以打了几个错字。现在修复它们:)

注意:我假设列表中的值是唯一的,并且您可以灵活地使用实际值的索引(或者您准备牺牲时间)

如果您真的想节省空间,我建议您使用列表列表来存储每个组合的值。实际上不需要存储映射(a,b)->x

例如,考虑列表:

a = [1,2,3,4]
假设组合/值对为:

(1,2) -> 2, (1,3) -> 3, (1,4) -> 4, (2,3) -> 5, (2,4) -> 6, (3,4) -> 7
组合/值对的存储将如下所示:

comb_value = [[2,3,4],[5,6],[7]]
检索:

假设列表a组合值是全局的。(我们将同时干运行代码。)

<代码>考虑x=2和y=4。 def梳(x,y): #若您可以直接使用索引,则应跳过接下来的两行。 x=find_index(x)#返回1。 y=find_index(y)#返回3。 如果x
注意:我假设列表中的值是唯一的,并且您可以灵活地使用实际值的索引(或者您准备牺牲时间)

如果您真的想节省空间,我建议您使用列表列表来存储每个组合的值。实际上不需要存储映射(a,b)->x

例如,考虑列表:

a = [1,2,3,4]
假设组合/值对为:

(1,2) -> 2, (1,3) -> 3, (1,4) -> 4, (2,3) -> 5, (2,4) -> 6, (3,4) -> 7
组合/值对的存储将如下所示:

comb_value = [[2,3,4],[5,6],[7]]
检索:

假设列表a组合值是全局的。(我们将同时干运行代码。)

<代码>考虑x=2和y=4。 def梳(x,y): #若您可以直接使用索引,则应跳过接下来的两行。 x=find_index(x)#返回1。 y=find_index(y)#返回3。 如果x 和一个函数来获取

def fetch(a, b):
    return d.get((a, b)) if (a, b) in d else d.get((b, a), None)
输出:

In [16]:
fetch('b', 'a')
Out[16]:
12

In [17]:
fetch('y', 'z')
Out[17]:
34

In [19]:
fetch('z', 'y')
Out[19]:
34

In [20]:
fetch('m', 'n')
和一个函数来获取

def fetch(a, b):
    return d.get((a, b)) if (a, b) in d else d.get((b, a), None)
输出:

In [16]:
fetch('b', 'a')
Out[16]:
12

In [17]:
fetch('y', 'z')
Out[17]:
34

In [19]:
fetch('z', 'y')
Out[19]:
34

In [20]:
fetch('m', 'n')

可能是
frozenset
s的
set
set(frozenset([a,b,comb(a,b)]),…)
对数据帧应用过滤器应该可以做到这一点。您能否使用索引而不是实际值访问组合?例如,如果您有列表a=[1,2,3,4],那么您可以使用comb(1,3),即索引,而不是查找comb(2,4)?可能是
frozenset
s的
set(frozenset([a,b,comb(a,b)]),…)
对数据帧应用过滤器应该可以做到这一点。您能否使用索引而不是实际值访问组合?例如,如果您的列表a=[1,2,3,4],那么您可以使用comb(1,3),即索引,而不是查找comb(2,4)?