繁体   English   中英

在 Python 中访问字典中的任意元素

[英]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())

这样我们就避免了项目查找和生成我们不使用的键列表。

蟒蛇3

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.

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