2014-07-23 60 views
0

我曾嘗試以下:Python3檢查只元組

vrs = [('first text', 1), 
     ('second text', 2), 
     ('third text', 3), 
     ('fourth text', 4), 
     ('fifth text', 5), 
     ('sixth text', 6), 
     ('seventh text', 7), 
     ('eighth text', 8), 
     ('ninth text', 9), 
     ('tenth text', 10), 
     ('eleventh text', 11), 
     ('twelfth text', 12) 
     ] 

if all(vr is tuple for vr in vrs): 
    print('All are tuples') 
else: 
    print('Error') 

if set(vrs) == {tuple}: 
    print('All are tuples') 
else: 
    print('Error') 

輸出是Error兩種。

是否有任何方法來檢查這個(即檢查列表中的每個元素是否是一個元組)?

+0

你試過'isinstance'嗎? – Kevin

+0

在什麼配置?如果您替換上面的'is'或'==',則會出現錯誤。 – dylnmc

+0

@ user3865473'isinstance'是一個函數,而不是一個運算符 – jonrsharpe

回答

4

isinstance使用:

isinstance(object, classinfo)

返回真,如果該對象參數是CLASSINFO參數的實例,或其(直接,間接或虛擬的)亞類的。

vrs = [('first text', 1), 
    ('second text', 2), 
    ('third text', 3), 
    ('fourth text', 4), 
    ('fifth text', 5), 
    ('sixth text', 6), 
    ('seventh text', 7), 
    ('eighth text', 8), 
    ('ninth text', 9), 
    ('tenth text', 10), 
    ('eleventh text', 11), 
    ('twelfth text', 12) 
    ]  
all(isinstance(x,tuple) for x in vrs) 
True 
vrs = [('first text', 1), 
    ('second text', 2), 
    ('third text', 3), 
    ('fourth text', 4), 
    ('fifth text', 5), 
    ('sixth text', 6), 
    ('seventh text', 7), 
    ('eighth text', 8), 
    ('ninth text', 9), 
    ('tenth text', 10), 
    ('eleventh text', 11), 
    'twelfth text' 
    ] 
    all(isinstance(x,tuple) for x in vrs) 
    False 
+0

這確實回答了這個問題,但無法解釋爲什麼Python程序員會這樣做。我簡直無法想象確保列表中的元素是元組會給你買什麼。 @迪蘭我可以交給你'[(1,2)(3,)('4','5',6),(7,8,9,10)]'所有這些都會通過謂詞,肯定會導致某個地方出現故障。你應該明白爲什麼[duck typing](http://en.wikipedia。org/wiki/Duck_typing)是Python中的常態;很大程度上是因爲它不會假裝解決它無法解決的問題。 – msw

-1

你可以使用過濾器來去除所有的元組元素,如:

nontuples = filter(lambda vr : vr is not tuple, vrs) 

,然後檢查剩餘的迭代是空的。這不會是一個列表,如果你在Python 3.x的是,但你可以把它與

nontuples = list(nontuples) 
+1

'不是元組'不檢查一個對象是否是一個元組的實例,但它檢查對象是否與當前命名的'tuple'實際上是同一個對象(這可能是內置類型。) – DSM

2

vr is tuple列表不檢查綁定到名稱vr對象是否tuple類型,它檢查名稱是否綁定到同一個對象(即,評估是否爲id(vr) == id(tuple))。它們不可避免地不是; tuple是一個type實例,而不是一個tuple實例!

相反,你應該使用isinstance

if all(isinstance(vr, tuple) for vr in vrs): 

這支持繼承(不像例如if all(type(vr) == tuple ...)),所以這也將允許例如在輸入中輸入namedtuple

但是,在Python中,並不總是需要檢查特定對象的類型(它使用強動態類型,也稱爲"duck typing")。雖然不清楚爲什麼要確保它們都是元組,但是有可能例如sequence types(例如tupleliststr)是可以接受的嗎?