2016-06-21 1 views
1

У меня есть список кортежей, которые я прокручиваю в простейшем цикле для определения кортежей, которые содержат некоторые условия.Python с использованием «IN» в цикле «IF ELSE»

mytuplist = 
    [(1, 'ABC', 'Today is a great day'), (2, 'ABC', 'The sky is blue'), 
    (3, 'DEF', 'The sea is green'), (4, 'ABC', 'There are clouds in the sky')] 

Я хочу, чтобы быть эффективным и читаемым, как это:

for tup in mytuplist: 
     if tup[1] =='ABC' and tup[2] in ('Today is','The sky'): 
      print tup 

Приведенный выше код не работает и ничего не печатается.

Этот код ниже работает, но очень многословие. Как сделать так, как показано выше?

for tup in mytuplist: 
    if tup[1] =='ABC' and 'Today is' in tup[2] or 'The sky' in tup[2]: 
     print tup 

ответ

7

Вы должны использовать встроенную any() функции:

mytuplist = [ 
    (1, 'ABC', 'Today is a great day'), 
    (2, 'ABC', 'The sky is blue'), 
    (3, 'DEF', 'The sea is green'), 
    (4, 'ABC', 'There are clouds in the sky') 
] 

keywords = ['Today is', 'The sky'] 
for item in mytuplist: 
    if item[1] == 'ABC' and any(keyword in item[2] for keyword in keywords): 
     print(item) 

Печать:

(1, 'ABC', 'Today is a great day') 
(2, 'ABC', 'The sky is blue') 
+2

им это лучший способ – Andrew

+0

Как мы делаем противоположный, пример, 'если пункт [1] =«ABC»и любой (ключевое слово в элементе [2] для ключевого слова в ключевых словах): 'для получения кортежей 3 и 4? – jxn

+0

@jxn хорошо, это даст вам кортеж 3: 'if item [1]! = 'ABC' и все (ключевое слово не в элементе [2] для ключевого слова по ключевым словам):'. В основном, мы просим, ​​чтобы все ключевые слова не совпадали. – alecxe

3

У вас нет, потому что in с последовательностью соответствует только всему элементу.

if tup[1] =='ABC' and any(el in tup[2] for el in ('Today is', 'The sky')): 
1

Вашего второго подход (который, однако, должен быть в скобках, как x and (y or z) быть правильными) tup[2]содержит одну из ваших ключевых фраз, а не элемент вашего набора ключей фразы. Вы можете использовать регулярное-выражение соответствия по стоимости выполнения некоторого:

if tup[1] == 'ABC' and re.match('Today is|The sky', tup[2])