python 中的元组键字典:访问整个条目块
Tuple-key dictionary in python: Accessing a whole block of entries
我正在寻找一种有效的 python 方法来利用具有两个键的散列 table:
例如:
(1,5) --> {a}
(2,3) --> {b,c}
(2,4) --> {d}
此外,我需要能够检索整个条目块,例如在第 0 个位置具有“2”的所有条目(此处:(2,3) 以及 (2,4)) .
在另一个 中,建议使用列表理解,即:
sum(val for key, val in dict.items() if key[0] == 'B')
我了解到字典(可能?)是从 key:value 对对象中检索值的最有效方法。但是,只调用一个不完整的元组键与查询整个键有点不同,在整个键中我要么得到一个值,要么什么都没有。我想问一下 python 是否仍然可以 return 在与匹配的 key:value 对数量成正比的时间内得到值?或者,元组字典(加上列表理解)是否比使用 pandas.df.groupby() 更好(但这会占用一点内存 space)?
“标准”方式类似于
d = {(randint(1,10),i):"something" for i,x in enumerate(range(200))}
def byfilter(n,d):
return list(filter(lambda x:x==n, d.keys()))
byfilter(5,d) ##returns a list of tuples where x[0] == 5
虽然在类似的情况下我经常使用 next()
手动迭代,当我不需要完整列表时。
但是,在某些用例中我们可以对其进行优化。假设您需要通过 key first 元素进行几次或更多次访问,并且您知道 dict 键同时没有改变。然后你可以提取列表中的键并对其进行排序,并使用一些 itertools
函数,即 dropwhile()
和 takewhile()
:
ls = [x for x in d.keys()]
ls.sort() ##I do not know why but this seems faster than ls=sorted(d.keys())
def bysorted(n,ls):
return list(takewhile(lambda x: x[0]==n, dropwhile(lambda x: x[0]!=n, ls)))
bysorted(5,ls) ##returns the same list as above
在最好的情况下(i=1
在我的示例中)这可以快 10 倍,在最坏的情况下(i=10
)或多或少花费相同的时间,因为我们正在修剪需要的迭代次数。
当然你也可以通过x[1]
访问密钥,你只需要在sort()
调用
中添加一个key
参数
我正在寻找一种有效的 python 方法来利用具有两个键的散列 table: 例如:
(1,5) --> {a}
(2,3) --> {b,c}
(2,4) --> {d}
此外,我需要能够检索整个条目块,例如在第 0 个位置具有“2”的所有条目(此处:(2,3) 以及 (2,4)) .
在另一个
sum(val for key, val in dict.items() if key[0] == 'B')
我了解到字典(可能?)是从 key:value 对对象中检索值的最有效方法。但是,只调用一个不完整的元组键与查询整个键有点不同,在整个键中我要么得到一个值,要么什么都没有。我想问一下 python 是否仍然可以 return 在与匹配的 key:value 对数量成正比的时间内得到值?或者,元组字典(加上列表理解)是否比使用 pandas.df.groupby() 更好(但这会占用一点内存 space)?
“标准”方式类似于
d = {(randint(1,10),i):"something" for i,x in enumerate(range(200))}
def byfilter(n,d):
return list(filter(lambda x:x==n, d.keys()))
byfilter(5,d) ##returns a list of tuples where x[0] == 5
虽然在类似的情况下我经常使用 next()
手动迭代,当我不需要完整列表时。
但是,在某些用例中我们可以对其进行优化。假设您需要通过 key first 元素进行几次或更多次访问,并且您知道 dict 键同时没有改变。然后你可以提取列表中的键并对其进行排序,并使用一些 itertools
函数,即 dropwhile()
和 takewhile()
:
ls = [x for x in d.keys()]
ls.sort() ##I do not know why but this seems faster than ls=sorted(d.keys())
def bysorted(n,ls):
return list(takewhile(lambda x: x[0]==n, dropwhile(lambda x: x[0]!=n, ls)))
bysorted(5,ls) ##returns the same list as above
在最好的情况下(i=1
在我的示例中)这可以快 10 倍,在最坏的情况下(i=10
)或多或少花费相同的时间,因为我们正在修剪需要的迭代次数。
当然你也可以通过x[1]
访问密钥,你只需要在sort()
调用
key
参数