2014-03-03 30 views
0

我有元組的列表:如果一個元組列表的特定位置「的一些元素」

MyList = [('name1', 'surname1', 'age1'), ('name2', 'surname2', 'age2'), ...] 

我想在MYLIST做一個檢查,「如果‘名2’,是這樣的:

if 'name2' in MyList[?][0]: 
    print "do something" 

如果我會寫if 'name2' in MyList[0]我將訪問元素(「名稱1」,「surname1」,「AGE-1」),而我的意思是訪問元素在每個元組的0位置列表 。我認爲有一個句法結構,但我是一個新手,無法找到它在線我自己,任何人都可以幫助我嗎?

回答

2

可以使用any功能和發電機功能,這樣

if any("name2" in name for name, surname, age in my_list): 
    # do something 

這裏的元組的所有元素都被解壓到name, surname, age而迭代。因此,我們可以簡單地檢查name2是否屬於名稱。這是一樣的書寫

if any("name2" in current_item[0] for current_item in my_list): 

這將是有效的,因爲它產生True後,立即有一個比賽,該項目的其餘部分不需要進行檢查。

如果你正在尋找一種方式來比較兩個字符串,你應該使用==運營商,像這樣

if any("name2" == name for name, surname, age in my_list): 
# do something 
+0

爲什麼'name2'的名字'?如果不是''name2'==''''? –

+0

@JayanthKoushik這就是他在問題中的含義。我將這個建議也包含在答案中。 – thefourtheye

1

的聲音,你可以使用字典中獲益:

my_dict = dict((x[0],(x[1],x[2])) for x in MyList) 

然後你可以檢查是否存在'names2' in my_dict並且還直接訪問數據my_dict['names2']

+0

這可能會產生一個問題,即必須創建一個新的詞典來比較姓氏和一個新的詞典來比較年齡。可能會失控。 – Guy

1

我不確定這是否是最e非常方法,但你可以使用它。

>>>MyList = [('name1', 'surname1', 'age1'), ('name2', 'surname2', 'age2'), ...] 
>>> if 'name2' in zip(*MyList)[0]: 
       #do something. 

重點是它創建了原始列表的轉置。 警告:所有的元組必須具有相同的長度以避免數據丟失。

編輯:官方docs爲zip。

官方docs對於*運算符用於解包參數列表。

相關問題