2014-04-26 33 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")) 
相关问题