2016-12-02 104 views
0

我試圖解決一個問題列表迭代,其中包含一個字典,列表和元組

l=[2,-8,9,0,-77,0,9.4,"hello","san",90,"a",(4,8,9),[8,9,9,"shree",{'a':1,'b':2,'c':[2,9,9,9.00]}]] 

我需要創建兩個列表,並添加第一個列表,如果數爲奇數和第二列出數字是否爲偶數,無論是元組中的數字還是列表中的列表。 如果字符串,然後忽略。如果有字典,那麼檢查值是奇數還是偶數,並將相應的列表添加爲奇數和偶數。

我的代碼是這樣的,但我越來越難以如何進一步進行。

l=[2,-8,9,0,-77,0,9.4,"hello","san",90,"a",(4,8,9),[8,9,9,"shree",{'a':1,'b':2,'c':[2,9,9,9.00]}]] 
even=[] 
odd=[] 

def fun(l): 
    for i in l: 
    if not isinstance(i,basestring): 
     if i%2==0: 
      even.append(i) 
     else:  
      odd.append(i) 

print even 
print odd 
print fun(l) 
+0

不應該有在被縮進 「如果不是isinstance(I,即basestring):」 – Zafi

+0

如果可能請發佈您的預期輸出 –

+0

@akashkarothiya 預期輸出爲 even = [2,-8,0,0,9.4,90,4,8,8,2,2] odd = [9,-77, 9,9,9,1,9,9,9] – ShreePool

回答

4

你必須遞歸調用你的fun功能,如果當前元素爲listtupledict,從而迭代和增加他們項目。

even=[] 
odd=[] 
def fun(lst): 
    for x in lst: 
     if isinstance(x, (list, tuple)): 
      fun(x) # recursively call for x 
     if isinstance(x, dict): 
      fun(x.values()) # call for values 
     if isinstance(x, (int, float)): 
      if x % 2 == 0: 
       even.append(x) 
      else: 
       odd.append(x) 

lst = [2,-8,9,0,-77,0,9.4,"hello","san",90,"a",(4,8,9),[8,9,9,"shree",{'a':1,'b':2,'c':[2,9,9,9.00]}]] 
fun(lst) 
print(even, odd) 
# [2, -8, 0, 0, 90, 4, 8, 8, 2, 2] [9, -77, 9.4, 9, 9, 9, 9, 9, 9.0, 1] 
+0

先生非常感謝,但是9.4甚至不是? – ShreePool

+0

反而會添加偶數和奇數作爲返回值,即使他的原始代碼也不會這樣做。 – Zafi

+2

9.4%2 = 1。4000000000000004,這不是0,所以它不是! – Zafi

1

您需要一系列if-else或switch來管理所有不同類型的可能性。 如果它是一個列表一個字典一個等..

0

你可以用這個啓動:

[even.append(x) if x % 2 == 0 else odd.append(x) for x in l if isinstance(x, int)] 

這將偶數地方evenodd號碼odd。對於tupleslistsdicts,您將需要(如Marco所述)在for循環中的if-else序列。

+0

非常感謝你,但我怎麼知道父列表中的下一個實體是字典和列表或元組 – ShreePool

1

考慮一下:

l=[2,-8,9,0,-77,0,9.4,"hello","san",90,"a",(4,8,9),[8,9,9,"shree",{'a':1,'b':2,'c':[2,9,9,9.00]}]] 

def descend(o): 
    if isinstance(o, (list, tuple)): 
     for v in o: 
      descend(v) 
    elif isinstance(o, dict): 
     descend(o.values()) 
    elif isinstance(o, (int, float)): 
     print o 

此打印:

>>> descend(l) 
2 
-8 
9 
0 
-77 
0 
9.4 
90 
4 
8 
9 
8 
9 
9 
1 
2 
9 
9 
9.0 
2 

這可以變成一臺發電機:

def descend(o): 
    if isinstance(o, (list, tuple)): 
     for v in o: 
      for r in descend(v): 
       yield r 
    elif isinstance(o, dict): 
     for r in descend(o.values()): 
      yield r 
    elif isinstance(o, (int, float)): 
     yield o 

導致:

>>> list(descend(l)) 
[2, -8, 9, 0, -77, 0, 9.4, 90, 4, 8, 9, 8, 9, 9, 1, 2, 9, 9, 9.0, 2] 

然後,我們可以分割清單:

even = [] 
odd = [] 

for x in descend(l): 
    (even if x % 2 == 0 else odd).append(x) 

導致:

>>> even 
[2, -8, 0, 0, 90, 4, 8, 8, 2, 2] 
>>> odd 
[9, -77, 9.4, 9, 9, 9, 1, 9, 9, 9.0] 
+0

爲遞歸定製:) – MYGz

+0

@Dan D.非常感謝你。你的解決方案很有幫助我明白了,但我認爲9.4甚至不是? – ShreePool

相關問題