TypeError: 'dict_keys' object does not support indexing

匿名 (未验证) 提交于 2019-12-03 00:59:01

问题:

def shuffle(self, x, random=None, int=int):     """x, random=random.random -> shuffle list x in place; return None.      Optional arg random is a 0-argument function returning a random     float in [0.0, 1.0); by default, the standard random.random.     """      randbelow = self._randbelow     for i in reversed(range(1, len(x))):         # pick an element in x[:i+1] with which to exchange x[i]         j = randbelow(i+1) if random is None else int(random() * (i+1))         x[i], x[j] = x[j], x[i]

When I run the shuffle function it raises the following error, why is that?

TypeError: 'dict_keys' object does not support indexing

回答1:

Clearly you're passing in d.keys() to your shuffle function. Probably this was written with python2.x (when d.keys() returned a list). With python3.x, d.keys() returns a dict_keys object which behaves a lot more like a set than a list. As such, it can't be indexed.

The solution is to pass list(d.keys()) (or simply list(d)) to shuffle.



回答2:

You're passing the result of somedict.keys() to the function. In Python 3, dict.keys doesn't return a list, but a set-like object that represents a view of the dictionary's keys and (being set-like) doesn't support indexing.

To fix the problem, use list(somedict.keys()) to collect the keys, and work with that.



回答3:

Why you need to implement shuffle when it already exists? Stay on the shoulders of giants.

import random  d1 = {0:'zero', 1:'one', 2:'two', 3:'three', 4:'four',      5:'five', 6:'six', 7:'seven', 8:'eight', 9:'nine'}  keys = list(d1) random.shuffle(keys)  d2 = {} for key in keys: d2[key] = d1[key]  print(d1) print(d2)


回答4:

In Python 2 dict.keys() return a list, whereas in Python 3 it returns a generator.

You could only iterate over it's values else you may have to explicitly convert it to a list i.e. pass it to a list function.



回答5:

convert iterative to list may have cost instead of it you can use

next(iter(keys))

for first item or if you want to itrate all items use

items = iter(keys) while True:     try:         item = next(items)     except StopIteration as e:         pass # finish


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!