2014-04-26 59 views
1

我有一個包含元組的列表,並且我想檢查一個元組中的第一個值是否包含特定值。在列表中用於檢查元組中的一個項目

這是我目前的解決方案:

cities = [("Hamburg", "Germany"), ("London", "England"), ("Paris", "France")] 
for city in cities: 
    if city[0] == "Hamburg": 
     contains_Hamburg = True 
     break 
else: 
    contains_Hamburg = False 

如果城市不還存放了國家,這將是這樣的:

cities_simple = ["Hamburg", "London", "Paris"] 
contains_Hamburg = "Hamburg" in cities_simple 

有沒有辦法混合那些和使用in運營商?例如,我可以做這樣的事情:

contains_Hamburg = "Hamburg" in [city[0] for city in cities] 

但這將創建第二個列表,所以我不敢隨便用這個(如果蟒蛇並沒有真正建立第二個名單,將被罰款,我想)。

+0

使用的字典:'contains_hamburg =「漢堡」,在字典(市)'。 – Daniel

回答

3

你很近! any可用於檢查任何元素是否爲True。通過使用generator expression而不是列表理解,可以避免額外的列表混亂內存。

contains_Hamburg = any('Hamburg' in c for c, s in cities) 

而且你能可能使用==,而不是in如下。

contains_Hamburg = any('Hamburg' == c for c, s in cities) 
+0

Bah,我想這兩個答案都沒有意義。雖然在城市裏爲c,s做'c =='漢堡'要快得多,而不是訪問索引。 –

+0

@亞歷山大啊謝謝,沒想到元組解包有所作爲。我會編輯我的答案。 – Ffisegydd

1

如果你的城市名單將元組和字符串的混合,如:

cities = [("Hamburg", "Germany"), ("London", "England"), ("Paris", "France"), "Toronto", "Montreal", "New York"] 

你可以有一個lambda函數把它解壓到:

city = lambda c: c if type(c) == str else c[0] 

,並用它在發電機中:

print('New York' in (city(c) for c in cities)) 
print('Paris' in (city(c) for c in cities)) 

如果你a再要使用很多次了許多城市,這將是值得創建一個函數一樣,

contains_city = lambda ct: ct in (city(c) for c in cities) 

print (contains_city("Moscow")) 
print (contains_city("Toronto")) 
相關問題