简体   繁体   中英

Python: How can I turn a list of tuples into dictionary keys?

I know that I can create a list of tuples that track with list indices like this:

my_tuples = [[(n,k) for n in range(10)] for k in range(10)]

However, I would like to use these as dictionary keys. I tried this with:

my_dict = dict(zip(my_tuples, some_other_iterable))

This, of course, gave me an "Unhashable Type: List" error, which I should've expected.

Is there a way, other than using a double for loop, to do what I was trying to do above with dict and zip?

A little sample of what I am looking for would be:

my_dict = {(0,0):None, (0,1):None, (0,2):None, (1,0):None, (1,1):None, (1,2):None}

Thanks for your time.

If you want to initialize a dict to a certain constant value given a list of keys, you can use the fromkeys() method:

dict.fromkeys((n,k) for n in range(3) for k in range(3))

Which will give you:

{(0, 0): None,
 (0, 1): None,
 (0, 2): None,
 (1, 0): None,
 (1, 1): None,
 (1, 2): None,
 (2, 0): None,
 (2, 1): None,
 (2, 2): None}

Your problem is that my_tuples is a nested list of 10 sublists of 10 elements. If you flatten the list, it works fine. For example:

my_tuples = [(n,k) for n in range(10) for k in range(10)]
my_dict = dict(zip(my_tuples, [None] * 100))
print(my_dict)

Output:

{(0, 0): None, (0, 1): None, (0, 2): None, (0, 3): None, (0, 4): None, (0, 5): None, (0, 6): None, (0, 7): None, (0, 8): None, (0, 9): None, (1, 0): None, (1, 1): None, (1, 2): None, (1, 3): None, (1, 4): None, (1, 5): None, (1, 6): None, (1, 7): None, (1, 8): None, (1, 9): None, (2, 0): None, (2, 1): None, (2, 2): None, (2, 3): None, (2, 4): None, (2, 5): None, (2, 6): None, (2, 7): None, (2, 8): None, (2, 9): None, (3, 0): None, (3, 1): None, (3, 2): None, (3, 3): None, (3, 4): None, (3, 5): None, (3, 6): None, (3, 7): None, (3, 8): None, (3, 9): None, (4, 0): None, (4, 1): None, (4, 2): None, (4, 3): None, (4, 4): None, (4, 5): None, (4, 6): None, (4, 7): None, (4, 8): None, (4, 9): None, (5, 0): None, (5, 1): None, (5, 2): None, (5, 3): None, (5, 4): None, (5, 5): None, (5, 6): None, (5, 7): None, (5, 8): None, (5, 9): None, (6, 0): None, (6, 1): None, (6, 2): None, (6, 3): None, (6, 4): None, (6, 5): None, (6, 6): None, (6, 7): None, (6, 8): None, (6, 9): None, (7, 0): None, (7, 1): None, (7, 2): None, (7, 3): None, (7, 4): None, (7, 5): None, (7, 6): None, (7, 7): None, (7, 8): None, (7, 9): None, (8, 0): None, (8, 1): None, (8, 2): None, (8, 3): None, (8, 4): None, (8, 5): None, (8, 6): None, (8, 7): None, (8, 8): None, (8, 9): None, (9, 0): None, (9, 1): None, (9, 2): None, (9, 3): None, (9, 4): None, (9, 5): None, (9, 6): None, (9, 7): None, (9, 8): None, (9, 9): None}

As an example with an iterable:

my_tuples = [(n,k) for n in range(10) for k in range(10)]
some_other_iterable = range(100)
my_dict = dict(zip(my_tuples, some_other_iterable))
print(my_dict)

Output:

{(0, 0): 0, (0, 1): 1, (0, 2): 2, (0, 3): 3, (0, 4): 4, (0, 5): 5, (0, 6): 6, (0, 7): 7, (0, 8): 8, (0, 9): 9, (1, 0): 10, (1, 1): 11, (1, 2): 12, (1, 3): 13, (1, 4): 14, (1, 5): 15, (1, 6): 16, (1, 7): 17, (1, 8): 18, (1, 9): 19, (2, 0): 20, (2, 1): 21, (2, 2): 22, (2, 3): 23, (2, 4): 24, (2, 5): 25, (2, 6): 26, (2, 7): 27, (2, 8): 28, (2, 9): 29, (3, 0): 30, (3, 1): 31, (3, 2): 32, (3, 3): 33, (3, 4): 34, (3, 5): 35, (3, 6): 36, (3, 7): 37, (3, 8): 38, (3, 9): 39, (4, 0): 40, (4, 1): 41, (4, 2): 42, (4, 3): 43, (4, 4): 44, (4, 5): 45, (4, 6): 46, (4, 7): 47, (4, 8): 48, (4, 9): 49, (5, 0): 50, (5, 1): 51, (5, 2): 52, (5, 3): 53, (5, 4): 54, (5, 5): 55, (5, 6): 56, (5, 7): 57, (5, 8): 58, (5, 9): 59, (6, 0): 60, (6, 1): 61, (6, 2): 62, (6, 3): 63, (6, 4): 64, (6, 5): 65, (6, 6): 66, (6, 7): 67, (6, 8): 68, (6, 9): 69, (7, 0): 70, (7, 1): 71, (7, 2): 72, (7, 3): 73, (7, 4): 74, (7, 5): 75, (7, 6): 76, (7, 7): 77, (7, 8): 78, (7, 9): 79, (8, 0): 80, (8, 1): 81, (8, 2): 82, (8, 3): 83, (8, 4): 84, (8, 5): 85, (8, 6): 86, (8, 7): 87, (8, 8): 88, (8, 9): 89, (9, 0): 90, (9, 1): 91, (9, 2): 92, (9, 3): 93, (9, 4): 94, (9, 5): 95, (9, 6): 96, (9, 7): 97, (9, 8): 98, (9, 9): 99}

Some tuples are hashable, like this

>>> my_tuples
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
>>> my_dict = {t:None for t in my_tuples}
>>> my_dict
{(0, 0): None, (0, 1): None, (0, 2): None, (1, 0): None, (1, 1): None, (1, 2): None}

Others are not. eg

>>> my_tuples = [([0,1], [1,1]), ([0,2], [1,2])]
>>> my_dict = {t:None for t in my_tuples}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <dictcomp>
TypeError: unhashable type: 'list'
>>>

my_tuples is a list of a list of tuples.

my_tuples = [[(n,k) for n in range(10)] for k in range(10)]

removing the parentheses will create a list of tuples

my_tuples = [(n,k) for n in range(10) for k in range(10)]

my_dict can be produced as you did it

my_dict = dict(zip(my_tuples, [None]*len(my_tuples))

or with a dictionary comprehension

my_dict = {x:None for x in my_tuples}

or

my_dict = {x:None for x,y in zip(my_tuples,[None]*len(my_tuples))}
my_tuples = [(n,k) for n in range(10) for k in range(10)]
x=dict()

for item in my_tuples:
    x[item]=None

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM