Python for循环索引

时间:2015-05-14 09:25:22

标签: python

我以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}

所以,我仍然不理解索引,为什么是(v,k)?

2 个答案:

答案 0 :(得分:6)

键和值列表的压缩列表的每个元组的键和值是unpacking,然后分配键/值对。 parens是不必要的for v, k in zip(keys, vals)也将起作用。您和本书代码之间的区别在于v,k的顺序,您使用keys列表作为键,而本书则反过来。

你也可以在一步中创建dict,在压缩的项目上调用dict,如果你颠倒传递给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分配{{1}中的每个元素列表和书籍代码正好相反。

答案 1 :(得分:4)

zip 将返回list of tuples

演示:

>>> 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词典中创建新的键和值对。
  3. 代码:

    >>> 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'}
    >>>