2012-07-23 256 views
0

好了,我有一個包含三個值(code, value, unit)Python類型比較

當我使用這個我需要檢查,如果值是一個海峽,列表或矩陣元組的列表。 (或檢查列表,然後檢查列表是否再次列表)

我的問題是我應該這樣做,還是有一些更好的方法?

for code, value, unit in tuples: 
    if isinstance(value, str): 
     # Do for this item 
    elif isinstance(value, collections.Iterable): 
     # Do for each item 
     for x in value: 
      if isinstance(x, str): 
        # Do for this item 
      elif isinstance(x, collections.Iterable): 
        # Do for each item 
        for x in value: 
         # ... 
      else: 
        raise Exception 
    else: 
     raise Exception 
+0

外'for'循環的主體相當混亂。第一行不應該有'x'而不是'value'?內部循環不應該像'for x in x'一樣嗎? – 2012-07-23 12:28:52

回答

3

最好的解決辦法是避免混合類型這樣,但如果你堅持下去,那麼你寫的是好的,除非我只檢查str實例。如果它不是一個字符串或一個迭代器,那麼無論如何你都會得到一個更合適的異常,所以不需要自己去做。

for (code,value,unit) in tuples: 
    if isinstance(value,str): 
     #Do for this item 
    else: 
     #Do for each item 
     for x in value: 
      if isinstance(value,str): 
        #Do for this item 
      else: 
        #Do for each item 
        for x in value: 
2

這工作,但每次調用isinstance時候,你應該問自己「我可以添加一個方法來value呢?」這將改變代碼爲:

for (code,value,unit) in tuples: 
    value.doSomething(code, unit) 

對於這個工作,你就必須包裝類型,如str,並列出了實現doSomething()

+0

我不會對值做任何事情,但可以將值賦給excelsheet。我相信像鄧肯所說的那樣,我做起來更容易。 – 2012-07-23 12:41:08

1

只需使用元組和捕獲任何異常幫手類型。不要看你跳之前:)

+3

我認爲你的意思是,_Easier要求寬恕比Permission_ :) – Aesthete 2012-07-23 13:01:46

2

你的方法的替代方法是這個代碼分解出到更一般的生成器函數(假設的Python 2.x的):

def flatten(x): 
    if isinstance(x, basestring): 
     yield x 
    else: 
     for y in x: 
      for z in flatten(y): 
       yield y 

(這也包含了簡化建議和Duncan's answer解釋。)

現在,你的代碼變得非常簡單易讀:

for code, value, unit in tuples: 
    for v in flatten(value): 
     # whatever 

將代碼分解也有助於在代碼中的幾個位置處理此數據結構。

0

遞歸將有所幫助。

def processvalue(value): 
    if isinstance(value, list): # string is type Iterable (thanks @sven) 
    for x in value: 
     processvalue(value) 
    else: 
    # Do your processing of string or matrices or whatever. 


# Test each the value in each tuple. 
for (code, value, unit) in tuples: 
    processvalue(value) 

這是處理嵌套結構的更好方法,並且還可以處理異常深度。

+0

在這種情況下,我知道2維數組是最大的,我必須對它們進行索引,這可能更難以使用這種方法 – 2012-07-23 13:37:31

+0

我不明白你的意思通過索引它們。 – Aesthete 2012-07-23 14:12:27