2015-05-18 2 views
0

мне нужно написать программу, чтобы предложить пользователю ввести строку запрещенных букв, а затем напечатать число слов, которые не содержат какой-либо из нихКак печатать слова, за исключением отдельной строки письма?

Это то, что у меня есть:

fin=open("demo.txt",'r') 
letters=str(raw_input("Enter the key you want to exclude")) 
def avoid(): 
    for line in fin: 
     word = line.strip() 
     for l in letters: 
      if l not in word: 
       print word   
avoid() 

Если я использую в ключе, он печатает все слова, которые имеют конкретные строки. Но он не работает, когда я использую не в.

ответ

0

Что-то, как это должно работать:

for l in letters: 
    if l in word: 
     break # we found the letter in the word, so stop looping 
else: 
    # This will execute only when the loop above didn't find 
    # any of the letters. 
    print(word) 
+0

Спасибо за решение, но все же программы избегают только первой буквы из строки –

+0

вы уверены в этом? обратите внимание, что приведенный выше код должен быть внутри цикла 'for word in ... ', поскольку он отображает только логические слова« только для слов, не содержащих букв ». –

0

Простейшее путь, чтобы сделать буквы набор, разделить каждую строку на слова и просуммировать, сколько раз там были слова без каких-либо запрещенных букв:

with open("demo.txt", 'r') as f: 
    letters = set(raw_input("Enter the key you want to exclude")) 
    print(sum(not letters.intersection(w) for line in f for w in line.split())) 

Вы также можете использовать str.translate, проверяя, если длина слова изменилось после того, как перевод:

with open("demo.txt", 'r') as f: 
    letters = raw_input("Enter the key you want to exclude") 
    print(sum(len(w.translate(None, letters)) == len(w) for line in f for w in line.split())) 

Если слово имеет одинаковую длину после попытки удалить любое letters, тогда слово не содержит буквы из букв.

Или с помощью any:

with open("in.txt", 'r') as f: 
    letters = raw_input("Enter the key you want to exclude") 
    print(sum(not any(let in w for let in letters) for line in f for w in line.split())) 

any(let in w for let in letters) проверит каждую букву в письмах и посмотреть, если какой-либо буквы в каждом слове, если она находит запрещенную письмо это будет короткое замыкание, и вернуть True либо вернуть False если в слове не появилось буквы, а затем перейти к следующему слову.

Вы не можете использовать if l in word, если только у вас есть только одно слово в строке, вам нужно разделить на отдельные слова.

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

for line in fin: 
    word = line.strip() 
    for l in letters: 
     if l in word: 
      break 
    else: 
     print word 

вещий способ сделать что вы хотите в цикле будет использовать любой:

for line in fin: 
    word = line.strip() 
    if not any(l not in word for l in letters): 
     print word 

что эквивалентно перерыв/еще только намного лучше.

Если вы хотите сумму, то вам нужно следить, как вы идете:

total = 0 
    for line in fin: 
     word = line.strip() 
     if not any(l not in word for l in letters): 
      total += 1 
print(total) 

Который является менее эффективным способом сделать:

print(sum(not any(let in w.rstrip() for let in letters) for word in f)) 
+0

Спасибо за решение mate –

+0

@ def_0101, не беспокойтесь, используя 'any' - это путь. –

-1

Это лучше:

forbidden='ab' 
    listofstring=['a','ab','acc','aaabb'] 
    for i in listofstring: 
     if not any((c in i) for c in forbidden): 
      print i 
+1

Это неверно, вы проверяете, не являются ли все запрещенные буквы словом –

+0

@PadraicCunningham "" "слова, которые не содержат ни одного из них" "" Я интерпретировал это. Я думаю, что «все» - это путь. Любые предложения – therealprashant

+0

Спасибо за решения –

0

Просто еще один способ.

exclude = set(raw_input("Enter the key you want to exclude")) 
with open("demo.txt") as f: 
    print len(filter(exclude.isdisjoint, f.read().split())) 
+0

Спасибо за решение mate –

+0

Добро пожаловать. Вы все еще ждали чего-то? (Я замечаю, что вы еще не приняли ни одного из наших ответов). –