社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

迭代python字典[重复]

AndyB • 5 年前 • 1504 次点击  

蟒蛇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
 
1504 次点击  
文章 [ 8 ]  |  最新文章 5 年前
Muhammad Haseeb
Reply   •   1 楼
Muhammad Haseeb    6 年前
list(newdict)

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

cs95
Reply   •   2 楼
cs95    6 年前

如果您需要单独存储密钥,这里有一个解决方案,它比迄今为止提供的所有其他解决方案都需要更少的输入,使用 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    7 年前

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

list(newdict)

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

for key in newdict:
    print key

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

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

在Python2上,使用 keys() .

cs95
Reply   •   4 楼
cs95    6 年前

您也可以使用 列表理解 :

>>> 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    10 年前

“鸭子打字”的定义有点离谱-- 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    7 年前

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

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

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    7 年前

尝试 list(newdict.keys()) .

这将转换 dict_keys 对象到列表。

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

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

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