Python - печатать только строки, если содержит элементы кортежа из списка

У меня есть следующий текстовый файл:

We are playing football at World Cup
teste
We are playing football
Playing test 
World Cup Football

И я хочу извлечь только строки, содержащие (Чемпионат мира и Футбол) или ('Игра', 'тест').

Например, на основе моего текстового файла я хочу извлечь только это:

We are playing football at World Cup
Playing test 
World Cup Footbal

В основном я хочу извлечь, только если строка содержит два значения из каждого кортежа.

Для этого я пробую следующий код:

file = 'text.txt'
words = [('Football','World Cup'), ('Playing test ')]
with open(file, "r") as ins:
    for line in ins:
        if all(x in line.lower() for x in words):
            print(line)

Но с моим кодом у меня возникает следующая ошибка:

TypeError: 'in <string>' requires string as left operand, not tuple

Как я могу это сделать?

Спасибо

Ваш код неоднозначен. сделать это ясно для второго элемента списка слов. Это ('playing test') или ('playing', 'test')??

Vicrobot 08.04.2019 18:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
344
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы были очень близки, вам просто нужен был еще один цикл:

file = 'text.txt'
words = [('Football','World Cup'), ('Playing test ')]
with open(file, "r") as ins:
    for line in ins:
        for tup in words:
            if all(word.lower() in line.lower() for word in tup):
                print(line)
Ответ принят как подходящий

Вы можете попробовать с комбинацией any и all:

if any(all(words.lower() in line.lower() for words in word_tuples) for word_tuples in words)

Вы можете отметить любое из списка слов и все из пунктов списка.

(Тестирование без файла)

# Note: second element needs to be tuple else causes unexpected results
words = [('Football','World Cup'), ('Playing test',)] 
ins = ["We are playing football at World Cup",
       "teste",
       "We are playing football",
       "Playing test",
       "World Cup Football"]

for line in ins:
    if any(all(words.lower() in line.lower() for words in word_tuples) for word_tuples in words):
        print(line)

Выход:

We are playing football at World Cup
Playing test
World Cup Football

Как упоминалось в комментарии ниже, если второй элемент не является кортежем, это приводит к неожиданному результату. Используя тестовый пример, ниже показана ошибка при сравнении, если все символы совпадают, а не слова:

x = "test palying"
if all(w.lower() in x for w in words[1]):
    print("ERROR")

Как работает ваш код, когда второй элемент слов не является кортежем. Также в коде оператора есть двусмысленность, поскольку он говорит две вещи об этом втором элементе.

Vicrobot 08.04.2019 18:12

@Vicrobot Спасибо! Я этого не понимал. Я думаю, что это приводит к неожиданному результату, поэтому для исправления второго элемента также необходимо tuple, т.е. ('Playing test',)

student 08.04.2019 18:26

Другие вопросы по теме