字典的由value来查找key?

46 views
Skip to first unread message

actberw

unread,
Feb 7, 2012, 11:05:44 PM2/7/12
to pyth...@googlegroups.com
有这么一种需求:
一个品牌有个官方名称 ,还对应有多个别名,这是一个字典结构,
我想把包含别名字符串,换成官方的名称,

字符串的查找我想用Ahocorasick来实现,先把所有的别名构建成个一个tree, 但是怎么着由匹配出来的别名来获得官方名称?
字典倒置?如果这个对应库太大怎么办?


麻烦各位大牛指点下,谢谢!

董诣

unread,
Feb 7, 2012, 11:11:35 PM2/7/12
to pyth...@googlegroups.com
空间换时间, 再建一个反向dict

 

麻烦各位大牛指点下,谢谢!

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

ubunoon

unread,
Feb 8, 2012, 3:51:16 AM2/8/12
to pyth...@googlegroups.com
LS的方式好,快捷容易

netchtg

unread,
Feb 8, 2012, 9:26:52 AM2/8/12
to pyth...@googlegroups.com
先合并成字符串最快

actberw <act...@gmail.com>编写:

>有这么一种需求:
>一个品牌有个官方名称 ,还对应有多个别名,这是一个字典结构,
>我想把包含别名字符串,换成官方的名称,
>
>字符串的查找我想用Ahocorasick<https://hkn.eecs.berkeley.edu/%7Edyoo/python/ahocorasick/>来实现,先把所有的别名构建成个一个tree,
>但是怎么着由匹配出来的别名来获得官方名称?
>字典倒置?如果这个对应库太大怎么办?

古晔

unread,
Feb 9, 2012, 7:53:27 AM2/9/12
to pyth...@googlegroups.com
dict(zip(d.values(), d.keys()))

lee Alexander

unread,
Feb 12, 2012, 2:48:43 AM2/12/12
to pyth...@googlegroups.com
存两个字典,一个正向,一个逆向,多用一倍存储空间,如果实在无法接受这个开销,那就自己用C来实现一个双向查找的数据结构好了。

叉叉

unread,
Feb 12, 2012, 2:59:50 AM2/12/12
to pyth...@googlegroups.com


2012/2/12 lee Alexander <superp...@gmail.com>

存两个字典,一个正向,一个逆向,多用一倍存储空间,如果实在无法接受这个开销,那就自己用C来实现一个双向查找的数据结构好了。


对于dict来说是多了一倍存储空间,但总算下来,肯定多不了一倍。因为值都是引用。所以,一般情况下也不会多占用太多的空间。 

zhao shichen

unread,
Feb 12, 2012, 3:39:49 AM2/12/12
to pyth...@googlegroups.com
dict(zip(d.values(), d.keys()))这个方式比较低效。

用类会更快

  8 class inverted(object):
  9     def __init__(self, data):
 10         self._data = data
 11 
 12     def __iter__(self):
 17         return self.__next__() # return next(self) requires python 3
 18 
 19     def __next__(self):
 20         data = self._data
 22         for k, v in data.items():
 23             yield v, k



--
呆痴木讷,君子四德

Xunzhen Quan

unread,
Feb 12, 2012, 3:50:56 AM2/12/12
to pyth...@googlegroups.com
你这个效率也高不到哪里去……最好的是 dict(izip(d.itervalues(), d.iterkeys())) 吧

2012/2/12 zhao shichen <shiche...@gmail.com>

Xunzhen Quan

unread,
Feb 12, 2012, 3:54:31 AM2/12/12
to pyth...@googlegroups.com
补充一下 izip 是 itertools 里面的……

2012/2/12 Xunzhen Quan <quanx...@gmail.com>

zhao shichen

unread,
Feb 12, 2012, 4:13:32 AM2/12/12
to pyth...@googlegroups.com
直觉总是错误的,自己跑一下就知道了
--
呆痴木讷,君子四德

Xunzhen Quan

unread,
Feb 12, 2012, 4:27:44 AM2/12/12
to pyth...@googlegroups.com
那我们就来跑一下嘛

>>> len(d)
100000
>>> timeit.timeit('dict(zip(d.values(), d.keys()))', 'from __main__ import d', number=100)
2.7744719982147217
>>> timeit.timeit('dict(izip(d.itervalues(), d.iterkeys()))', 'from __main__ import d, izip', number=100)
1.3053929805755615
>>> timeit.timeit('dict(inverted(d))', 'from __main__ import d, inverted', number=100)
4.057111024856567

Python 2.7.1 on Mac

上面的结果看出,你的那个比最简单的方案还要慢,更不要说我提出的那个了。

2012/2/12 zhao shichen <shiche...@gmail.com>

zhao shichen

unread,
Feb 12, 2012, 5:00:12 AM2/12/12
to pyth...@googlegroups.com
确实你的快,我上次测试过一次,也许我什么地方搞错了

我当时还想,这很奇怪呢
Reply all
Reply to author
Forward
0 new messages