Note that there are some explanatory texts on larger screens.

plurals
  1. POBest way to turn a list into a dict, where the keys are a value of each object?
    primarykey
    data
    text
    <p>I am attempting to take a list of objects, and turn that list into a dict. The dict values would be each object in the list, and the dict keys would be a value found in each object.</p> <p>Here is some code representing what im doing:</p> <pre><code>class SomeClass(object): def __init__(self, name): self.name = name object_list = [ SomeClass(name='a'), SomeClass(name='b'), SomeClass(name='c'), SomeClass(name='d'), SomeClass(name='e'), ] object_dict = {} for an_object in object_list: object_dict[an_object.name] = an_object </code></pre> <p>Now that code works, but its a bit ugly, and a bit slow. Could anyone give an example of something thats faster/"better"?</p> <p><em>edit:</em> Alright, thanks for the replies. I must say i am surprised to see the more pythonic ways <strong>seeming</strong> slower than the hand made way.</p> <p><em>edit2:</em> Alright, i updated the test code to make it a bit more readable, with so many tests heh.</p> <p>Here is where we are at in terms of code, i put authors in the code and if i messed any up please let me know.</p> <pre><code>from itertools import izip import timeit class SomeClass(object): def __init__(self, name): self.name = name object_list = [] for i in range(5): object_list.append(SomeClass(name=i)) def example_1(): 'Original Code' object_dict = {} for an_object in object_list: object_dict[an_object.name] = an_object def example_2(): 'Provided by hyperboreean' d = dict(zip([o.name for o in object_list], object_list)) def example_3(): 'Provided by Jason Baker' d = dict([(an_object.name, an_object) for an_object in object_list]) def example_4(): "Added izip to hyperboreean's code, suggested by Chris Cameron" d = dict(izip([o.name for o in object_list], object_list)) def example_5(): 'zip, improved by John Fouhy' d = dict(zip((o.name for o in object_list), object_list)) def example_6(): 'izip, improved by John Fouhy' d = dict(izip((o.name for o in object_list), object_list)) def example_7(): 'Provided by Jason Baker, removed brackets by John Fouhy' d = dict((an_object.name, an_object) for an_object in object_list) timeits = [] for example_index in range(1, 8): timeits.append( timeit.Timer( 'example_%s()' % example_index, 'from __main__ import example_%s' % example_index) ) for i in range(7): timeit_object = timeits[i] print 'Example #%s Result: "%s"' % (i+1, timeit_object.repeat(2)) </code></pre> <p>With 5 objects in the list i am getting a result of:</p> <pre><code> Example #1 Result: "[1.2428441047668457, 1.2431108951568604]" Example #2 Result: "[3.3567759990692139, 3.3188660144805908]" Example #3 Result: "[2.8346641063690186, 2.8344728946685791]" Example #4 Result: "[3.0710639953613281, 3.0573830604553223]" Example #5 Result: "[5.2079918384552002, 5.2170760631561279]" Example #6 Result: "[3.240635871887207, 3.2402129173278809]" Example #7 Result: "[3.0856869220733643, 3.0688989162445068]" </code></pre> <p>and with 50:</p> <pre><code> Example #1 Result: "[9.8108220100402832, 9.9066231250762939]" Example #2 Result: "[16.365023136138916, 16.213981151580811]" Example #3 Result: "[15.77024507522583, 15.771029949188232]" Example #4 Result: "[14.598290920257568, 14.591825008392334]" Example #5 Result: "[20.644147872924805, 20.64064884185791]" Example #6 Result: "[15.210831165313721, 15.212569952011108]" Example #7 Result: "[17.317100048065186, 17.359367847442627]" </code></pre> <p>And lastly, with 500 objects:</p> <pre><code> Example #1 Result: "[96.682723999023438, 96.678673028945923]" Example #2 Result: "[137.49416589736938, 137.48705387115479]" Example #3 Result: "[136.58069896697998, 136.5823769569397]" Example #4 Result: "[115.0344090461731, 115.1088011264801]" Example #5 Result: "[165.08325910568237, 165.06769108772278]" Example #6 Result: "[128.95187497138977, 128.96077489852905]" Example #7 Result: "[155.70515990257263, 155.74126601219177]" </code></pre> <p>Thanks to all that replied! Im very surprised with the result. If there are any other tips for a faster method i would love to hear them. Thanks all!</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload