x******a 发帖数: 6336 | 1 我有一个dict,keys是一个3维或者更一般的n维tuples,希望可以定一个函数query这个
map的一列值
class foo()
df={(1,2,3):'a', (2,3,4):'b', (1,3,4):'c',(2,4, 3):'d'}
def query(self, set_a=None, set_b=None, set_c=None):
需要:
1 如果set_a, set_b, set=c都是 None,就throw exception
2.如果某个/某几个不是空的,就返回valid keys对应的list. e.g.
set_a=set([1]),
foo.query(set_a)应该返回['a', 'c']
请问这个function可以怎么样实现?
另外df比较大,有50000个keys,values是4年的时间序列,怎么做比较efficient
多谢
| L***s 发帖数: 1148 | 2
需求提得有问题,会写程序的人一般不这么问
我猜你可能想要下面的效果,猜得不对你自己酌情修改
In [4]: class Foo (object):
...:
...: def __init__ (self, raw_dict):
...: self.num_to_string_set = {}
...: for tup, string in raw_dict.iteritems():
...: for num in tup:
...: self.num_to_string_set\
...: .setdefault(num,set())\
...: .add(string)
...:
...: def query (self, *nums):
...: assert len(nums) > 0
...: result = set()
...: for num in nums:
...: result |= self.num_to_string_set[num]
...: return list(result)
...:
In [5]: foo = Foo({(1,2,3):'a', (2,3,4):'b', (1,3,4):'c',(2,4, 3):'d'})
In [6]: foo.query(1)
Out[6]: ['a', 'c']
In [7]: foo.query(1,2)
Out[7]: ['a', 'c', 'b', 'd']
In [8]: foo.query(3,2,4)
Out[8]: ['a', 'c', 'b', 'd']
In [9]: foo.query()
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
in ()
----> 1 foo.query()
in query(self, *nums)
8
9 def query (self, *nums):
---> 10 assert len(nums) > 0
11 result = set()
12 for num in nums:
AssertionError:
【在 x******a 的大作中提到】 : 我有一个dict,keys是一个3维或者更一般的n维tuples,希望可以定一个函数query这个 : map的一列值 : class foo() : df={(1,2,3):'a', (2,3,4):'b', (1,3,4):'c',(2,4, 3):'d'} : def query(self, set_a=None, set_b=None, set_c=None): : : 需要: : 1 如果set_a, set_b, set=c都是 None,就throw exception : 2.如果某个/某几个不是空的,就返回valid keys对应的list. e.g. : set_a=set([1]),
| p***o 发帖数: 1252 | 3 我猜你猜错了, query(1,2)应该返回['a'], query(None,3,4)应该返回['b','c'].
这个
【在 L***s 的大作中提到】 : : 需求提得有问题,会写程序的人一般不这么问 : 我猜你可能想要下面的效果,猜得不对你自己酌情修改 : In [4]: class Foo (object): : ...: : ...: def __init__ (self, raw_dict): : ...: self.num_to_string_set = {} : ...: for tup, string in raw_dict.iteritems(): : ...: for num in tup: : ...: self.num_to_string_set\
| x******a 发帖数: 6336 | 4 多谢两位
我想要的是
query(set_a={1}, set_b={2})= ['a']
query(set_a={3}, set_b={2}, set_b={4})=[]
query(set_a={1, 2}, set_b={2,3}) 应该对应到4个类型的keys: ( a=1, b=2, any
c is ok), (a=2, b=2, any c is ok), (a=1,b=3, any c is ok), (a=2, b=3, any
c is ok).
query(set_a={1, 2}, set_c={3})应该对应到 (a=1, any b is ok, c=3), (a=2, any
b is ok, c=3).
thanks! | L***s 发帖数: 1148 | 5
就简单朴素地地暴力解好了,白开水一样的代码,确保正确
efficiency等真正需要时再考虑
In [15]: def query (df, q):
...: result = []
...: for tup, string in df.iteritems():
...: for i, numset in q.iteritems():
...: if tup[i] not in numset:
...: break
...: else: # i.e., no break
...: result.append(string)
...: return result
...:
In [16]: df = {(1,2,3):'a', (2,3,4):'b', (1,3,4):'c', (2,4,3):'d'}
In [20]: query(df, { 0:{1}, 1:{2}, })
Out[20]: ['a']
In [21]: query(df, { 0:{3}, 1:{2}, 2:{4}, })
Out[21]: []
In [22]: query(df, { 0:{1,2}, 1:{2,3}, })
Out[22]: ['b', 'c', 'a']
In [23]: query(df, { 0:{1,2}, 2:{3}, })
Out[23]: ['d', 'a']
【在 x******a 的大作中提到】 : 多谢两位 : 我想要的是 : query(set_a={1}, set_b={2})= ['a'] : query(set_a={3}, set_b={2}, set_b={4})=[] : query(set_a={1, 2}, set_b={2,3}) 应该对应到4个类型的keys: ( a=1, b=2, any : c is ok), (a=2, b=2, any c is ok), (a=1,b=3, any c is ok), (a=2, b=3, any : c is ok). : query(set_a={1, 2}, set_c={3})应该对应到 (a=1, any b is ok, c=3), (a=2, any : b is ok, c=3). : thanks!
| x******a 发帖数: 6336 | 6 thanks a lot Leiss!
【在 L***s 的大作中提到】 : : 就简单朴素地地暴力解好了,白开水一样的代码,确保正确 : efficiency等真正需要时再考虑 : In [15]: def query (df, q): : ...: result = [] : ...: for tup, string in df.iteritems(): : ...: for i, numset in q.iteritems(): : ...: if tup[i] not in numset: : ...: break : ...: else: # i.e., no break
| c********l 发帖数: 8138 | 7 其实就是多维key的lookup
非常常用的一个功能
【在 x******a 的大作中提到】 : 我有一个dict,keys是一个3维或者更一般的n维tuples,希望可以定一个函数query这个 : map的一列值 : class foo() : df={(1,2,3):'a', (2,3,4):'b', (1,3,4):'c',(2,4, 3):'d'} : def query(self, set_a=None, set_b=None, set_c=None): : : 需要: : 1 如果set_a, set_b, set=c都是 None,就throw exception : 2.如果某个/某几个不是空的,就返回valid keys对应的list. e.g. : set_a=set([1]),
|
|