Python循环索引

3
我正在参考Mark Lutz的《学习Python》书中的示例。
keys = ['spam','eggs','toast']
vals=[1,4,7]

D2={}
for (v,k) in zip(keys, vals): D2[k] = v
 D2
{1: 'spam', 4: 'eggs', 7: 'toast'}

我的示例:

 D1={}

 for (k,v) in zip(keys, vals): D1[k] = v
  D1
    {'toast': 7, 'eggs': 4, 'spam': 1}

所以,我仍然不明白索引是什么,为什么是for(v,k)?
2个回答

6

这段代码的作用是从键和值列表的压缩列表中解压每个元组的键和值,然后分配键/值对。括号是不必要的,for v, k in zip(keys, vals)也可以工作。你的代码与书中的代码的区别在于v,k的顺序,你使用keys列表作为键,而书中则相反。

你还可以通过一步调用字典来创建字典,如果你颠倒传递给zip的列表的顺序,那么你将得到完全相同的行为:

D2 = dict(zip(keys, vals))

print  D2

D2 = dict(zip(vals, keys))

print(D2)

{'toast': 7, 'eggs': 4, 'spam': 1}
{1: 'spam', 4: 'eggs', 7: 'toast'}

唯一的区别在于顺序。事实上,列表被命名为键和值可能有点令人困惑,因为最终值会成为键,反之亦然,但要理解的主要内容是,在循环中将k分配给来自keys列表的每个元素,而书本代码则相反。

4

zip会返回元组列表

演示:

>>> keys = ['spam','eggs','toast']
>>> vals=[1,4,7]
>>> zip(keys, vals)
[('spam', 1), ('eggs', 4), ('toast', 7)]

拆包

演示:

>>> t = (1,2,3)
>>> t
(1, 2, 3)
>>> a,b,c = t
>>> a
1
>>> b
2
>>> c
3
>>> a,b = t
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> 

  1. 我们迭代列表,所以它首先将元组的第一个项解包到 v 中,将第二个项解包到 k 中。
  2. 在 D2 字典中创建新的键和值对。

代码:

>>> D2={}
>>> for (v,k) in zip(keys, vals):
...   print "v:", v
...   print "k", k
...   D2[k]   =   v
...   #  ^        ^
      #  Key     Value


v: spam
k 1
v: eggs
k 4
v: toast
k 7
>>> D2
{1: 'spam', 4: 'eggs', 7: 'toast'}
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接