[英]Access an arbitrary element in a dictionary in Python
如果mydict
不为空,我访问任意元素为:
mydict[mydict.keys()[0]]
有没有更好的方法来做到这一点?
在 Python 3 上,以非破坏性和迭代方式:
next(iter(mydict.values()))
在 Python 2 上,以非破坏性和迭代方式:
mydict.itervalues().next()
如果你想让它在 Python 2 和 3 中工作,你可以使用six
包:
six.next(six.itervalues(mydict))
虽然在这一点上它很神秘,我更喜欢你的代码。
如果要删除任何项目,请执行以下操作:
key, value = mydict.popitem()
请注意,“第一”在这里可能不是一个合适的术语,因为dict
在 Python < 3.6 中不是有序类型。 Python 3.6+ dicts
是有序的。
如果您只需要访问一个元素(偶然成为第一个元素,因为 dicts 不保证排序),您可以简单地在Python 2 中执行此操作:
my_dict.keys()[0] -> key of "first" element
my_dict.values()[0] -> value of "first" element
my_dict.items()[0] -> (key, value) tuple of "first" element
请注意(据我所知)Python 不保证对这些方法中的任何一个的 2 次连续调用将返回具有相同顺序的列表。 这在 Python3 中不受支持。
在Python 3 中:
list(my_dict.keys())[0] -> key of "first" element
list(my_dict.values())[0] -> value of "first" element
list(my_dict.items())[0] -> (key, value) tuple of "first" element
在python3中,方式:
dict.keys()
返回一个类型为 dict_keys() 的值,当通过这种方式获得 dict 键的第一个成员时,我们会得到一个错误:
dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing
最后,我将 dict.keys() 转换为 list @1st,并通过 list splice 方法获得第一个成员:
list(dict.keys())[0]
next(iter(mydict))
next(iter(mydict.values()))
next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2
前两个是 Python 2 和 3。后两个在 Python 3 中是惰性的,但在 Python 2 中不是。
正如其他人提到的,没有“第一项”,因为字典没有保证的顺序(它们被实现为哈希表)。 例如,如果你想要对应于最小键的值, thedict[min(thedict)]
会这样做。 如果您关心插入键的顺序,即“首先”表示“最早插入”,那么在 Python 3.1 中您可以使用collections.OrderedDict ,这也在即将推出的 Python 2.7 中; 对于旧版本的 Python,请下载、安装并使用有序的 dict backport(2.4 及更高版本),您可以在此处找到。
Python 3.7 现在字典是按插入顺序排列的。
忽略围绕 dict 排序的问题,这可能会更好:
next(dict.itervalues())
这样我们就避免了项目查找和生成我们不使用的键列表。
next(iter(dict.values()))
这个怎么样。 这里还没有提到。
py 2 & 3
a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2
在python3中
list(dict.values())[0]
python3的最简单方法:
list(dict.keys())[0]
对于 Python 2 和 3:
import six
six.next(six.itervalues(d))
你总是可以这样做:
for k in sorted(d.keys()):
print d[k]
如果排序对您有任何意义,这将为您提供一个一致排序的(我猜是关于内置的.hash() 键)您可以处理的键集。 这意味着例如即使您展开字典,数字类型也会一致地排序。
例子
# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())
# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())
# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())
请注意,字典在打印时已排序。 但是键集本质上是一个哈希图!
根据@alldayremix的评论更新@swK的答案:
在Python 3中使用:
list(my_dict.keys())[0] -> key of "first" element
list(my_dict.values())[0] -> value of "first" element
list(my_dict.items())[0] -> (key, value) tuple of "first" element
first_key, *rest_keys = mydict
没有外部库,适用于 Python 2.7 和 3.x:
>>> list(set({"a":1, "b": 2}.values()))[0]
1
对于任意键,只需省略 .values()
>>> list(set({"a":1, "b": 2}))[0]
'a'
子类化dict
是一种方法,虽然效率不高。 在这里,如果您提供一个整数,它将返回d[list(d)[n]]
,否则按预期访问字典:
class mydict(dict):
def __getitem__(self, value):
if isinstance(value, int):
return self.get(list(self)[value])
else:
return self.get(value)
d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
'e': 'test', 'f': 'dictionary', 'g': 'testing'})
d[0] # 'hello'
d[1] # 'this'
d['c'] # 'is'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.