你如何找到字典中的第一把钥匙?

sla*_*goy 128 python dictionary

我想让我的程序"banana"从字典中打印出来.最简单的方法是什么?

请注意,我并不是试图让我的程序打印出与之相关的值"banana",而是打印出"banana"一个for循环,所以当我运行它时,每个键也会打印出来.

这是我的字典:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}
Run Code Online (Sandbox Code Playgroud)

max*_*lec 197

如果您只需要字典中的一个键,这可能是最短的Python 2和3有效代码:

my_dict = {'foo': 'bar'}
next(iter(my_dict)) # outputs 'foo'
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要Python 3中的键和值:`next(iter(my_dict.items()))` (16认同)
  • @RyanHaining Python 字典通过从 CPython 3.6 开始的插入和从 Python 3.7 开始的任何其他 Python 实现进行排序 (4认同)

yln*_*nor 85

字典没有编入索引,但它以某种方式排序.以下将为您提供第一个现有密钥:

list(my_dict.keys())[0]
Run Code Online (Sandbox Code Playgroud)

  • 放`list(my_dict)[0]`会更容易,因为它仍然会检索键列表吗? (13认同)
  • 您创建附加列表只是为了获取一个元素。真是浪费内存和CPU。 (6认同)
  • 非常贵。 (4认同)
  • @让-弗朗索瓦T。是的 (3认同)

Rya*_*ing 33

如果你在谈论常规dict,那么"第一把钥匙"并不意味着什么.钥匙不以您可以依赖的任何方式订购.如果你迭代你,dict你可能不会"banana"像你看到的那样.

如果你需要保持秩序,那么你必须使用一个OrderedDict而不仅仅是一个普通的字典.

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])
Run Code Online (Sandbox Code Playgroud)

如果你想要按顺序查看所有键,可以通过迭代来完成

for k in prices:
    print(k)
Run Code Online (Sandbox Code Playgroud)

您可以,或者将所有键放入列表中,然后使用它

ks = list(prices)
print(ks[0]) # will print "banana"
Run Code Online (Sandbox Code Playgroud)

获取第一个元素而不创建列表的更快方法是调用next迭代器.在尝试获取nth元素时,这并不能很好地概括

>>> next(iter(prices))
'banana'
Run Code Online (Sandbox Code Playgroud)


wih*_*lke 24

如果你只想要字典中的第一个键,你应该使用许多人之前建议的

first = next(iter(prices))
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要第一个并将其余部分保留为列表,则可以使用值解包运算符

first, *rest = prices
Run Code Online (Sandbox Code Playgroud)

这同样适用于价值被替换pricesprices.values()和两个键和值,你甚至可以使用拆包作业

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4
Run Code Online (Sandbox Code Playgroud)

注意:您可能很想使用first, *_ = prices只获取第一个键,但我通常建议不要使用这种用法,除非字典非常短,因为它会遍历所有键并为它创建一个列表rest有一些开销。

注意:正如其他人提到的,插入顺序是从python 3.7(或技术上 3.6)及更高版本中保留的,而早期的实现应被视为未定义的顺序。


Shi*_*hah 17

对于下面的Python 3,消除了列表转换的开销:

first = next(iter(prices.values()))
Run Code Online (Sandbox Code Playgroud)


小智 10

dict类型是无序的映射,所以有作为"第一"元件这样的东西.

你想要的可能是什么collections.OrderedDict.

  • 从 Python 3.6 开始,这已经发生了变化。现在订购字典。 (5认同)

tur*_*yag 5

因此,我在尝试优化某个东西以获取已知长度为1的字典中的唯一键并仅返回键时找到了此页面。对于我尝试过的最大尺寸为700的所有字典,以下过程是最快的。

我尝试了7种不同的方法,发现这是我使用Python 3.6的2014 Macbook上最好的方法:

def first_5():
    for key in biased_dict:
        return key
Run Code Online (Sandbox Code Playgroud)

对它们进行概要分析的结果是:

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7
Run Code Online (Sandbox Code Playgroud)

我尝试过的所有方法都在这里:

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key
Run Code Online (Sandbox Code Playgroud)

  • 是的,不仅是最快的,而且是乡村英里最快的。也是最容易阅读、方便的。 (2认同)

小智 5

那么简单,根据我的答案将是

first = list(prices)[0]

将字典转换为列表将输出键,我们将从列表中选择第一个键。

  • 对于 python3,不需要创建一个全新的列表来仅检索其第一个元素。最好使用“next(iter(prices))”,正如其他答案已经建议的那样。 (5认同)

Fer*_*erd 5

假设您要打印第一个密钥:

print(list(prices.keys())[0])
Run Code Online (Sandbox Code Playgroud)

如果你想打印第一个键的值:

print(prices[list(prices.keys())[0]])
Run Code Online (Sandbox Code Playgroud)