Python社区  »  Python

迭代python字典[重复]

AndyB • 9 月前 • 77 次点击  

蟒蛇2.7 ,我可以拿字典 钥匙 , 价值观 ,或者 项目 作为列表:

>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]

现在,在 python>=3.3 ,我得到如下信息:

>>> newdict.keys()
dict_keys([1, 2, 3])

所以,我必须这样做才能得到一个列表:

newlist = list()
for i in newdict.keys():
    newlist.append(i)

我想知道,有没有更好的方法来返回列表 巨蟒3 ?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38781
 
77 次点击  
分享到微博
文章 [ 8 ]  |  最新文章 9 月前
Muhammad Haseeb
Reply   •   1 楼
Muhammad Haseeb    10 月前
list(newdict)

这是一个最简单的解决方案,非常有魅力!

cs95
Reply   •   2 楼
cs95    1 年前

如果您需要单独存储密钥,这里有一个解决方案,它比迄今为止提供的所有其他解决方案都需要更少的输入,使用 Extended Iterable Unpacking (python3.x+)。

newdict = {1: 0, 2: 0, 3: 0}
*k, = newdict

k
# [1, 2, 3]

            ╒═══════════════╤═════════════════════════════════════════╕
            │ k = list(d)   │   9 characters (excluding whitespace)   │
            ├───────────────┼─────────────────────────────────────────┤
            │ k = [*d]      │   6 characters                          │
            ├───────────────┼─────────────────────────────────────────┤
            │ *k, = d       │   5 characters                          │
            ╘═══════════════╧═════════════════════════════════════════╛
Jim Fasarakis Hilliard Cas
Reply   •   3 楼
Jim Fasarakis Hilliard Cas    2 年前

转换为列表而不使用 keys 方法使其更具可读性:

list(newdict)

而且,当翻阅字典时,不需要 keys() :

for key in newdict:
    print key

除非您在循环中修改它,这需要预先创建的键列表:

for key in list(newdict):
    del newdict[key]

在Python2上,使用 keys() .

cs95
Reply   •   4 楼
cs95    1 年前

您也可以使用 列表理解 :

>>> newdict = {1:0, 2:0, 3:0}
>>> [k  for  k in  newdict.keys()]
[1, 2, 3]

或者,更短,

>>> [k  for  k in  newdict]
[1, 2, 3]

注:3.7下的版本不保证订购(订购仍然只是CPython 3.6的一个实现细节)。

Chris Barker
Reply   •   5 楼
Chris Barker    5 年前

“鸭子打字”的定义有点离谱-- dict.keys() 返回一个iterable对象,而不是一个类似列表的对象。它可以在任何一个iTable可以工作的地方工作——而不是列表可以工作的地方。列表也可以是iterable,但iterable不是列表(或序列…)

在实际的用例中,使用dict中的键最常见的事情是迭代它们,所以这是有意义的。如果你确实需要它们作为一个列表,你可以打电话给 list() .

非常类似于 zip() --在绝大多数情况下,它是迭代的——为什么创建一个完整的新的元组列表来迭代它,然后再次丢弃它?

这是Python使用更多迭代器(和生成器)而不是各地列表副本的大趋势的一部分。

听写键() 不过,应该理解——仔细检查是否有打字错误或其他什么…它对我来说很好:

>>> d = dict(zip(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'], [None, None]))
>>> [key.split(", ") for key in d.keys()]
[['Sounder V Depth', 'F'], ['Vessel Latitude', 'Degrees-Minutes']]
jolvi Seb
Reply   •   6 楼
jolvi Seb    2 年前

list(newdict) 同时在python 2和python 3中工作,提供 newdict . keys() 不需要。(:

Jim Fasarakis Hilliard Cas
Reply   •   7 楼
Jim Fasarakis Hilliard Cas    2 年前

python>=3.5可选:解包到列表文本中 [*newdict]

新的 unpacking generalizations (PEP 448) 与python 3.5一起引入,现在您可以轻松地执行以下操作:

>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]

打开包装 * 与一起工作 任何 对象,它是可Iterable的,并且由于字典在遍历时返回它们的键,所以您可以通过在列表文本中使用它轻松地创建列表。

添加 .keys() [*newdict.keys()] 可能有助于使您的意图更明确一点,尽管这会使您损失函数查找和调用。(老实说,这不是你应该做的事 真正地 担心)。

这个 *iterable 语法类似于 list(iterable) 其行为最初记录在 Calls section python参考手册。在PEP 448中,限制 *无法识别 可能出现的是松动的,允许它也被放在列表、集合和元组文本中,参考手册 Expression lists 也更新了以说明这一点。


虽然相当于 list(newdict) 不同的是,它更快(至少对于小字典而言),因为实际上没有执行函数调用:

%timeit [*newdict]
1000000 loops, best of 3: 249 ns per loop

%timeit list(newdict)
1000000 loops, best of 3: 508 ns per loop

%timeit [k for k in newdict]
1000000 loops, best of 3: 574 ns per loop

对于较大的字典,速度几乎是相同的(遍历大型集合的开销比函数调用的成本小)。


以类似的方式,您可以创建元组和字典键集:

>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}

注意元组中的尾随逗号!

Jim Fasarakis Hilliard Cas
Reply   •   8 楼
Jim Fasarakis Hilliard Cas    2 年前

尝试 list(newdict.keys()) .

这将转换 dict_keys 对象到列表。

另一方面,你应该问问自己这是否重要。编写代码的方法是假设duck输入法( 如果它看起来像一只鸭子,像一只鸭子嘎嘎叫,那就是一只鸭子。 )这个 听写键 对象在大多数情况下都像一个列表。例如:

for key in newdict.keys():
  print(key)

显然,插入操作符可能不起作用,但对于字典键列表来说,这没有多大意义。