2016-12-02 102 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

相关问题