2014-04-26 2 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

dict :'contains_hamburg = "Hamburg in dict (cities)'를 사용하면 가치가 있습니다. – Daniel

답변

3

끝났습니다! any은 모든 요소가 참인지 확인하는 데 사용할 수 있습니다. 그리고 목록 이해가 아닌 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

바하마, 나는 여기에 우리의 대답이 둘 다 없다고 생각했다. 'c =='함부르크의 'c'는 '도시에서'보다 색인에 액세스하는 것이 더 빠르지 만. –

+0

@Alex 아 고마워요, 튜플을 풀고 차이를 만드는 생각하지 않았다. 나는 내 대답을 편집 할 것이다. – Ffisegydd

1

당신의 도시 목록에서와 같이 튜플 문자열의 혼합이 될 것입니다 경우 :

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

및 사용 :

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

당신은 압축을 해제 할 수있는 람다 함수를 가질 수있다 발전기의 경우 :

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

많은 도시에서 이것을 여러 번 사용하려고하면 다음과 같은 함수를 만들어야합니다.

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

print (contains_city("Moscow")) 
print (contains_city("Toronto")) 
관련 문제