saluton al ciuj
i know how to get item by key
=============== ===
dict = {10 : 50, 2 : 12, 4 : 43}
print dict[2] 12
but i wonder how to get key by item
print dict[12]
2
=============== ===
is there a more fast way than that one (my dictionary is really big)
=============== ===
dict = {10 : 50, 2 : 12, 4 : 43}
item = 12
for key in dict.keys():
if dict[key] == item:
print key
break
=============== === 11 10470
Egor> i know how to get item by key
...
Egor> but i wonder how to get key by item
Assuming your dictionary defines a one-to-one mapping, just invert it: forward = {10 : 50, 2 : 12, 4 : 43} reverse = dict([(v,k) for (k,v) in forward.iterite ms()]) print forward
{10: 50, 4: 43, 2: 12} print reverse
{50: 10, 43: 4, 12: 2}
That doubles your storage, so you'll have to trade that off against the
speed gain of not having to loop over the entire dictionary.
Skip
In article <ma************ *************** ***********@pyt hon.org>,
Skip Montanaro <sk**@pobox.com > wrote: Egor> i know how to get item by key ... Egor> but i wonder how to get key by item
Assuming your dictionary defines a one-to-one mapping, just invert it:
>>> forward = {10 : 50, 2 : 12, 4 : 43} >>> reverse = dict([(v,k) for (k,v) in forward.iterite ms()]) >>> print forward {10: 50, 4: 43, 2: 12} >>> print reverse
{50: 10, 43: 4, 12: 2}
That doubles your storage, so you'll have to trade that off against the speed gain of not having to loop over the entire dictionary.
Well, you *do* loop over the entire dictionary, but you only do it once,
when you create the reverse dict. If you are only going to do a single
lookup, it's no gain, but if you amortize the cost over many lookups,
it's almost certainly a big win.
This raises an interesting question. Let's assume that you add all the
entries to the dictionary before you do any lookups, and you then need
to lookup things up in both directions. Which is faster, to
simultaneously build both the forward and reverse dicts, or to just
build the forward one and when you're done doing that, build the reverse
one in a single shot with the above list comprehension?
BTW, does Python really build the intermediate list and throw it away
after using it to initialize the dictionary, or is it smart enough to
know that it doesn't really need to build the whole list in memory? That doubles your storage, so you'll have to trade that off against the speed gain of not having to loop over the entire dictionary.
Roy> Well, you *do* loop over the entire dictionary, but you only do it
Roy> once, when you create the reverse dict. If you are only going to
Roy> do a single lookup, it's no gain, but if you amortize the cost over
Roy> many lookups, it's almost certainly a big win.
Sure, but the OP said his dictionary was big. It's up to him to decide
whether the space-time tradeoff is worth it (or even possible).
Roy> BTW, does Python really build the intermediate list and throw it
Roy> away after using it to initialize the dictionary, or is it smart
Roy> enough to know that it doesn't really need to build the whole list
Roy> in memory?
That's why I called .iteritems() in my example. It won't generate the
entire list of tuples as .items() would.
Skip
Skip Montanaro <sk**@pobox.com > wrote: Roy> BTW, does Python really build the intermediate list and throw it Roy> away after using it to initialize the dictionary, or is it smart Roy> enough to know that it doesn't really need to build the whole list Roy> in memory?
That's why I called .iteritems() in my example. It won't generate the entire list of tuples as .items() would.
I know it won't generate the list of items from the forward dict, but I
was thinking of the list generated by the list comprehension, passed as
the argument to the reverse dict constructor. That's the throw-away
list I was thinking of (see Tim Delaney's response to my post).
In article <ma************ *************** ***********@pyt hon.org>,
Skip Montanaro <sk**@pobox.com > wrote: Assuming your dictionary defines a one-to-one mapping, just invert it:
>>> forward = {10 : 50, 2 : 12, 4 : 43} >>> reverse = dict([(v,k) for (k,v) in forward.iterite ms()]) >>> print forward {10: 50, 4: 43, 2: 12} >>> print reverse
{50: 10, 43: 4, 12: 2}
That doubles your storage, so you'll have to trade that off against the speed gain of not having to loop over the entire dictionary.
To be precise, it doubles the storage of the *dictionary*, but it does
*NOT* double the storage of the keys and items. Depending on how big
those are, the cost of building a second dict might be mostly lost in the
noise.
--
Aahz (aa**@pythoncra ft.com) <*> http://www.pythoncraft.com/
"19. A language that doesn't affect the way you think about programming,
is not worth knowing." --Alan Perlis
Skip Montanaro wrote: Egor> i know how to get item by key ... Egor> but i wonder how to get key by item
Assuming your dictionary defines a one-to-one mapping, just invert it:
>>> forward = {10 : 50, 2 : 12, 4 : 43} >>> reverse = dict([(v,k) for (k,v) in forward.iterite ms()]) >>> print forward {10: 50, 4: 43, 2: 12} >>> print reverse
{50: 10, 43: 4, 12: 2}
That doubles your storage, so you'll have to trade that off against the speed gain of not having to loop over the entire dictionary.
Skip
But beware that all the items in the original dictionary must be
hashable. The example shows just integers, so I assume they are in this
case. But generally, this may not work.
--
\/ \/
(O O)
-- --------------------oOOo~(_)~oOOo----------------------------------------
Keith Dart <kd***@kdart.co m>
vcard: <http://www.kdart.com/~kdart/kdart.vcf>
public key: ID: F3D288E4 URL: <http://www.kdart.com/~kdart/public.key>
=============== =============== =============== =============== =============== =
Skip Montanaro wrote: That doubles your storage
careful: it creates another dictionary structure with the same size as the first
one, but it doesn't copy the objects in the dictionary.
so whether it doubles the actual memory usage depends on what data you
have in the dictionary (last time I checked, ints and dictionary slots were the
same size, but I cannot think of any other object that isn't larger...)
(but you knew that, of course)
</F>
Skip Montanaro wrote: Egor> i know how to get item by key ... Egor> but i wonder how to get key by item
Assuming your dictionary defines a one-to-one mapping, just invert it:
>>> forward = {10 : 50, 2 : 12, 4 : 43} >>> reverse = dict([(v,k) for (k,v) in forward.iterite ms()]) >>> print forward {10: 50, 4: 43, 2: 12} >>> print reverse
{50: 10, 43: 4, 12: 2}
That doubles your storage, so you'll have to trade that off against the speed gain of not having to loop over the entire dictionary.
Skip
If some keys has the same value as the item this will cause problems
because keys in your result dictionary can be overwritten. Could it be a
option to build the result dictionary as a dictionary with the values
as the keys, and lists of keys as the value. Perhaps you need to use a
loop for this.
--
--------------------------------------
Ola Natvig <ol********@inf osense.no>
infoSense AS / development
Ola Natvig wrote: If some keys has the same value as the item this will cause problems because keys in your result dictionary can be overwritten. Could it be a option to build the result dictionary as a dictionary with the values as the keys, and lists of keys as the value. Perhaps you need to use a loop for this.
<<Python 2.4>>
..>>> d = dict(foo=1, bar=1, bob=7, jane=42, mary=16, fred=16)
..>>> from itertools import groupby
..>>> val = d.__getitem__
..>>> grouped = groupby(sorted( d.iterkeys(), key=val), val)
..>>> r = dict((value, list(keys)) for value, keys in grouped)
..>>> r
{16: ['mary', 'fred'], 1: ['bar', 'foo'], 42: ['jane'], 7: ['bob']}
Cheers,
Nick.
--
Nick Coghlan | nc******@email. com | Brisbane, Australia
--------------------------------------------------------------- http://boredomandlaziness.skystorm.net This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: none |
last post by:
or is it just me?
I am having a problem with using a dictionary as an attribute of a
class. This happens in python 1.5.2 and 2.2.2 which I am accessing
through pythonwin builds 150 and 148 respectively
In the sample code you see that I have class Item and class Dict
class Dict contains a dictionary called items. The items dictionary
will contain instances of Item that are keyed off of the Item name. In
__main__ I create two...
|
by: boohoo |
last post by:
I can't seem to do this:
I want to take a query string and place two halves of the querystring
into two separate dictionary objects.
So... I loop through the collection of querystring items, right?
When I get to a certain item in the querystring, all items after that
are to be put into the SECOND dictionary object.
|
by: Fox |
last post by:
Hi,
I am working on a project which
used dictionaries. I am having
to remake part of this and have
no experience with the
scripting dictionary.
I need to see how to create multiple
dictionaries within one dictionary.
|
by: john wright |
last post by:
I have a dictionary oject I created and I want to bind a listbox to it. I
am including the code for the dictionary object.
Here is the error I am getting:
"System.Exception: Complex DataBinding accepts as a data source either an
IList or an IListSource
at System.Windows.Forms.ListControl.set_DataSource(Object value)
|
by: Martin Widmer |
last post by:
Hi folks.
I am using this collection class:
Public Class ContentBlocksCollection
Inherits DictionaryBase
'Object variables for attributes
'Attributes
Default Public Property Item(ByVal nDBKey As Long) As ContentBlock
Get
| |
by: Martin Widmer |
last post by:
Hi Folks.
When I iterate through my custom designed collection, I always get the
error:
"Unable to cast object of type 'System.Collections.DictionaryEntry' to type
'ContentObjects.ContentBlock'."
The error occurs at the "For...Each" line if this method:
|
by: Dan Holmes |
last post by:
I have a custom dictionary and i would like to bind it to a control.
Since Dictionary doesn't implement IList i would have to write it. Is
the only way to do this to keep another collection that matches the key
in the dictionary to an index in the collection?
dan
Here is the code i want to add IList to.
public interface ISystemMessageData
|
by: davenet |
last post by:
Hi,
I'm new to Python and working on a school assignment.
I have setup a dictionary where the keys point to an object. Each
object has two member variables. I need to find the smallest value
contained in this group of objects.
The objects are defined as follows:
|
by: =?Utf-8?B?U2hhd24=?= |
last post by:
Hi;
I would like to be able to use the XMLSerializer to serialize and
deserialize a dictionary. is that possible? i know that you can serialize an
object that implements the ICollection interface. does the fact that
Dictionary inherits from ICollection<cause a problem?
Currently i am using a class that inherits from ICollection and it has a
Dictionary as it's container. but when it gets to creating the serialized
object it blows up. here...
|
by: dudeja.rajat |
last post by:
Hi,
How to check if something is a list or a dictionary or just a string?
Eg:
for item in self.__libVerDict.itervalues():
self.cbAnalysisLibVersion(END, item)
where __libVerDict is a dictionary that holds values as strings or
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
| |
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own....
Now, this would greatly impact the work of software developers. The idea...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
| |
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
|
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |