通过字典迭代列表

Nes*_*esa 0 python dictionary

我有一个列表,其值与字典的键相同.我想写一个代码,它对字典的值做了一些事情(比如将它们增加一个),就像它们的键出现在列表中一样多次.

所以,例如

listy=['dgdg','thth','zuh','zuh','thth','dgdg']
dicty = {'dgdg':1, 'thth':2, 'zuh':5}
Run Code Online (Sandbox Code Playgroud)

我试过这段代码:

def functy (listx,dictx):
    for i in range (0, len(listx)):
        for k,v in dictx:
            if listx[i]==k:
                v=v+1
            else:
                pass
functy(listy, dicty)
Run Code Online (Sandbox Code Playgroud)

但它引发了这个错误:

Traceback (most recent call last):
  File "C:\Python34\8.py", line 12, in <module>
    functy(listy, dicty)
  File "C:\Python34\8.py", line 6, in functy
    for k,v in dictx:
ValueError: too many values to unpack (expected 2)
Run Code Online (Sandbox Code Playgroud)

你能告诉我它为什么不起作用以及我怎么做到的?

Seb*_*zny 5

dict.__iter__默认情况下会参考dict.keys().

因为你想要key它和它的价值

for k,v in dictx.items():
Run Code Online (Sandbox Code Playgroud)

这将产生一个元组列表:

>>> a={1:2,2:3,3:4}
>>> a.items()
[(1, 2), (2, 3), (3, 4)]
Run Code Online (Sandbox Code Playgroud)

iteritems 也可用,但来自生成器而不是列表的收益:

>>> a.iteritems()
<dictionary-itemiterator object at 0x00000000030115E8>
Run Code Online (Sandbox Code Playgroud)

但是,您应该考虑通过密钥直接建立索引,否则您的任务v=v+1将不会持久保存到dict:

def functy (listx,dictx):
    for item in listx:
        if item in dictx:
            dictx[item]+=1

>>> listy=['dgdg','thth','zuh','zuh','thth','dgdg']
>>> dicty = {'dgdg':1, 'thth':2, 'zuh':5}            
>>> print dicty
{'thth': 2, 'zuh': 5, 'dgdg': 1}
>>> functy(listy, dicty)
>>> print dicty
{'thth': 4, 'zuh': 7, 'dgdg': 3}
Run Code Online (Sandbox Code Playgroud)