2015-04-23 2 views
1

Выполнение упражнения на CheckIO и мне интересно, почему это не сработает. Учитывая набор строк, я пытаюсь вернуть True, если какая-либо из строк является суффиксом любой другой строки в наборе. В противном случае. Используя itertools, я сначала генерирую необходимые перестановки в кортежах. Тогда для каждого кортежа (каждый i) я хотел видеть трудный путь, если второй кортеж был в конце первого кортежа (опция 1). В другом случае использовалась функция .endwith (option2), но ни одна из них не будет работать для меня. Почему эти два варианта ошибочны?Python Определение суффикса в наборе строк

import itertools 

def checkio(words_set): 
    for i in itertools.permutations(words_set, 2): 
    #option1 ---- if i[1] in i[0][-len(i[1]):]: 
    #option2 ---- if i[0].endswith(i[1]): 
      return True 
     else: 
      return False 

примеры:

checkio({"hello", "lo", "he"}) == True 

checkio({"hello", "la", "hellow", "cow"}) == False 

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

def checkio(words_set): 
    for w1 in words_set: 
     for w2 in words_set: 
      if w1.endswith(w2) and w1 != w2: 
       return True 
    return False 
+0

Это упражнение, так что я просто предлагаю думая о сортировке. –

ответ

0

Его так вы return False сразу после первой проверки. и если он терпит неудачу, он вернется False, вам нужно положить его из своей петли for!

Но как более вещими, как вы можете использовать combinations и выражение генератора в any функции:

>>> from itertools import combinations 
>>> s={"hello", "lo", "he"} 
>>> any(i.endswith(j) or j.endswith(i) for i,j in (combinations(s,2))) 
True 
>>> s2={"hello", "la", "hellow", "cow"} 
>>> any(i.endswith(j) or j.endswith(i) for i,j in (combinations(s2,2))) 
False 
+0

«Неправильно, потому что вы всегда проверяете i [0] .endswith (i [1]), но вам нужно i [1] .endswith (i [0]). »- itertools.permutations делает это для вас. – Arkanosis

+0

@ Арканоз Да! я пропустил это! Спасибо за напоминание! – Kasramvd

0

Поскольку это упражнение, я не буду давать вам полный ответ, но вы уверены, что вы действительно хотите, чтобы return False в статье else?

1

Вашего return False должен быть в конце для цикла, в противном случае функция возвращает True/False на каждое первое сравнение и будет игнорировать все последующие сравнения:

import itertools 

def checkio(words_set): 
    for i in itertools.permutations(words_set, 2): 
     if i[0].endswith(i[1]): 
      return True 

    return False 
Смежные вопросы