由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - python一问,怎么实现这个函数
相关主题
mutating input argument不应该鼓励吧请问有没有用过IMSL库的大虾? (转载)
Windows下大家都用什么SqlConsole啊?大侠们说说C(C++)或Fortran比较Matlab到底优点在哪儿?
question about using Hive parameter (转载)newbie python question
Querying JSON in Postgres几个Python的小问题
谁能说说Perl, Python, Tcl各自的优缺点?主要应用场合?GNUPLOT怎么样画大小不同的点
python, pickleHelp: undefined symbol
问一个Mandriva 2007 下Tix的问题Python IDLE的一个问题
问个BT问题 :)(c )花了一个小时学习了python
相关话题的讨论汇总
话题: set话题: query话题: out话题: df话题: none
进入Programming版参与讨论
1 (共1页)
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]),

1 (共1页)
进入Programming版参与讨论
相关主题
花了一个小时学习了python谁能说说Perl, Python, Tcl各自的优缺点?主要应用场合?
Scripting language的几个问题python, pickle
repast 请进: python debian安装问题问一个Mandriva 2007 下Tix的问题
并行程序能做到不用专门写么?问个BT问题 :)(c )
mutating input argument不应该鼓励吧请问有没有用过IMSL库的大虾? (转载)
Windows下大家都用什么SqlConsole啊?大侠们说说C(C++)或Fortran比较Matlab到底优点在哪儿?
question about using Hive parameter (转载)newbie python question
Querying JSON in Postgres几个Python的小问题
相关话题的讨论汇总
话题: set话题: query话题: out话题: df话题: none