2011-09-28 162 views
3

我是Python新手。词典迭代Python

词典有多个值。

dc = {1:['2', '3'], 2:['3'], 3:['3', '4']} 

如果迭代'dc',则会发现有三次出现'3'。首先出现在1:['2','3']中。 我想遍历字典,这样

if first occurrence of '3' occurs: 
    dosomething() 

else occurrence of '3' afterwards:#i.e. 2nd time, 3rd time.... 
    dosomethingelse() 

我怎样才能做到这一点在Python

谢谢。

+4

既然字典没有排序,那么''第一'出现'3'是什么意思? – wim

+3

ps.s.命名你的变量'dict'是一个坏主意,因为你影响内置 – wim

+0

谢谢Wim。我不确定这是否可能。有三次出现3,我的意思是1:['2','3']在这里,3出现第一次 –

回答

1

您还可以保留元素已被看到的次数。用于此的字典,并增加每个目击:

#!/usr/bin/python 

dc = {3:['3', '4'], 1:['2', '3'], 2:['3']} 
de={} 

def do_something(i,k): 
    print "first time for '%s' with key '%s'" % (i,k) 

def do_somethingelse(i,j,k): 
    print "element '%s' seen %i times. Now with key '%s'" % (i,j,k) 

for k in sorted(dc): 
    for i in dc[k]: 
     if i not in de: 
      de[i]=1 
      do_something(i,k) 
     else: 
      de[i]+=1 
      do_somethingelse(i,de[i],k) 

正如其他人所说,字典不具有相同的顺序一定是插入或代码清单。如果这与排序顺序相同,您可以对键(与sorted(dc))进行排序以区分“第一”与后续。这种方法很容易扩展到'do_somthing',这取决于许多倍的项目被看到。

输出:

first time for '2' with key '1' 
first time for '3' with key '1' 
element '3' seen 2 times. Now with key '2' 
element '3' seen 3 times. Now with key '3' 
first time for '4' with key '3' 

或者:

r=[] 
for k in sorted(dc): 
    print dc[k] 
    if '3' in dc[k]: 
     r.append("'3' number {} with key: {}".format(len(r)+1,k)) 

生产:

["'3' number 1 with key: 1", "'3' number 2 with key: 2", "'3' number 3 with key: 3"] 

r将具有在的dc键中的排序顺序的3串列表,那么只需遍历序列即可。

如果你只是寻找“第一个” 3那么剩下的,你可以使用列表理解:

>>> l=[i for sub in [dc[k] for k in sorted(dc)] for i in sub if i == '3'] 
>>> l 
['3', '3', '3'] 
>>> l[0] 
'3' 
>>> l[1:] #all the rest... 
+0

我认为他正在寻找第一个包含'3'的列表,而不是所有的'3'按排序顺序...... – 2011-09-28 22:44:11

0

下面的代码片段会给你一个关于如何去做的想法。 这将在单线程执行环境中工作。

欲了解更多信息开始在Python文档和Dive Into Python

firstInstance = False 
for k in mydict.keys(): 
    obj = mydict.get(k) 
    for i in range(len(obj)): 
    value = obj[i] 
    if value == 3 and firstInstance: 
     doSomething() 
     firstInstance = True 
    else: 
     doSomethingElse() 
+1

如果你来自Java方面,这将给你一个如何去做的想法。 @ chown的答案是更好的pythonic方法 –

+2

'对于范围内的我(len(obj))'很少适合。这当然不合适。 –

+0

该网址应该是http://diveintopython.org – artdanil

4

假设在字典的值列表:

foundThree = False 
for key, val in dc.items(): 
    if '3' in val and not foundThree: 
     foundThree = True 
     # doSomething() 
    elif '3' in val: 
     # doSomethingElse() 
    else: 
     # doAnotherThing() 

编辑(更新您的关于寻找第一个评论'3',这是一个字典项的值) - 这应该工作:

for key, val in dc.items(): 
    foundThree = False 
    for n in val: 
     if n == '3' and not foundThree: 
      foundThree = True 
      # doSomething() 
     elif n == '3': 
      # doSomethingElse() 
     else: 
      # doAnotherThing() 
+0

你应该在某处找到三个。 – wim

+0

@wim刚刚注意到我忘了在评估之后将其设置为True。谢谢! – chown

+1

这很好。但。真/假旗几乎总是变成柜台。你应该考虑使用'threeCount = 0'; val和threeCount == 0中的'threeCount + = 1'和'if'3'',这样扩展处理更加优雅。 –

3

你要求的大部分内容都非常简单,我唯一能看到你遇到麻烦的部分是确定数字3是否出现在第一个元素之后。

你可以这样做:

list[1:] 

例如:

>>> 3 in [1,2,4,5][1:] 
False 
>>> 3 in [3,1,2,4][1:] 
False 
>>> 3 in [1,2,3,4][1:] 
True 

这里的东西应该工作:

dc = {1:['2', '3'], 2:['3'], 3:['3', '4']} 

def dosomething(): print 'something' 

def dosomethingelse(): print 'something else' 

for key,value in dc.items(): 
    if value[0] == '3': 
    dosomething() 
    elif '3' in value[1:]: 
    dosomethingelse() 
3
dict_ = {1:['2', '3'], 2:['3'], 3:['3', '4']} 

def dosomething(): 
    print 'doing something' 

def dosomethingelse(): 
    print 'doing something else' 

three_handler = dosomething 
for v in dict_.values(): 
    for three in [x for x in v if x == '3']: 
    three_handler() 
    three_handler = dosomethingelse 

输出:

doing something 
doing something else 
doing something else 
2

这是一个替代方案,它不使用if语句来检查3是否是第一次出现。

d = {1:['2', '3'], 2:['3'], 3:['3', '4']} 

def doSomething(): 
    print('ds') 

def doSomethingElse(): 
    print('dse') 

for key,value in d.iteritems(): 
    do = doSomething 
    for item in value: 
     if item == '3': 
     do() 
     do = doSomethingElse 
0

假设“第一”是字典的键作为排序,这个工程:

>>> dc = {1:['2', '3'], 2:['3'], 3:['3', '4']} 
>>> [dc[k] for k in sorted(dc) if '3' in dc[k]][0] 
['2', '3'] 
>>> [dc[k] for k in sorted(dc) if '3' in dc[k]][1:] 
[['3'], ['3', '4']]