I have a list that looks like:
[('A', 1), ('B', 2), ('C', 3)]
I want to turn it into a dictionary that looks like:
{'A': 1, 'B': 2, 'C': 3}
What’s the best way to go about this?
EDIT: My list of tuples is actually more like:
[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]
I am getting the error ValueError: dictionary update sequence element #0 has length 1916; 2 is required
Your error:
Why you are getting the
ValueError: dictionary update sequence element #0 has length 1916; 2 is requirederror:The answer is that the elements of your list are not what you think they are. If you type
myList[0]you will find that the first element of your list is not a two-tuple, e.g.('A', 1), but rather a 1916-length iterable.Once you actually have a list in the form you stated in your original question (
myList = [('A',1),('B',2),...]), all you need to do isdict(myList).[2021 edit: now also answers the actual question asked, not the intended question about the specific error:]
In general:
Either use the usual
dict(iterableOrMapping)constructor, or use the dict comprehension{someExpr(k,v) for k:v in iterable}syntax:A Python dictionary is an O(1)-searchable unordered collection of pairs {(
key→value), …} where keys are any immutable objects and values are any object.Keys MUST implement the
.__eq__()and
.__hash__()methods to be usable in the dictionary. If you are thinking of implementing this, you are likely doing something wrong and should maybe consider a different mapping data structure! (Though sometimes you can get away with wrapping the keys in a different wrapper structure and using a regular dict, this may not be ideal.)Intermediate or advanced programmers who wish to implement a ‘frozen’ or ‘immutable’ type, or one which masquerades as one, must be very careful of implications or else your program will be wrong with extremely subtle and near-impossible-to-find bugs:
You can’t use a dict if you allow yourself to mutate the object later such that its notion of equality might change. Objects considered equal must always have
__eq__return True and have__hash__return identical values.The methods must exactly obey the spec. This means that:
hash(x)==hash(y)meansxMIGHT equalyand the internal python code must then checkx==y(.__eq__) to confirm it’s a true-positive and not a false-positive. This allows O(1) lookup.__hash__value not change for any reason once the object is in its final state. If you cannot guarantee both this andhash(x)!=hash(y) implies x!=y, you should not be using a dict.Python has a bunch of built-in frozen datastructures such as
namedtuple,frozenset, etc., but they are sometimes harder to work with.tupleis the basic frozen variant of the basicliststructure (which would let you store a{(1, 2): 3, (4, 5): 6}). It also has some variants of thedictstructure. If you want to get a map from "frozen dicts" to values, frozendict doesn’t exist except as a third-party library, but you can extract the dict’s.items()as a an unorderedfrozensetoftuples.