2016-03-19 3 views
-2

Мне нужно сравнить наборы, чтобы увидеть, если один набор содержится в другомPython сравнивающие наборы

Я импортирующей два текстовых файла в виде наборов.

из .txt файлов вы можете увидеть, что наборы состоят из линий.

  • set1 = set(['thats true', 'thats false'])

  • set2 = set(['Well done thats true', 'Unfortunately thats false'])

'тот ложный' появляется в течение первого индекса set2 'К сожалению Thats ложных. Как распечатать индекс, где set1 содержится в set2?

+0

Это звучит, как вы не только хотите проверить, если один набор является подмножеством другого, но если строка (элемент множества) подстрока другая строка. Вы можете уточнить? –

+0

Вы тестируете * подстроки *; нет строгого пересечения между вашими наборами, а объекты набора Python не поддерживают то, что вы хотите из коробки. Вам нужно либо выполнить тесты N x M (создать произведение двух наборов и проверить каждую комбинацию), либо построить индекс смежных слов, чтобы более эффективно выполнять поиск фразы. Но это слишком широко, чтобы обсуждать здесь на SO. –

+0

@ T.Silver do sets содержат строки? Извините, если так, вы правы. Я хочу выполнить поиск по всему второму набору, чтобы увидеть, включен ли первый набор в любом месте во втором наборе. –

ответ

0

Вопрос должен быть изменен, чтобы отражать тот факт, что порядок имеет значение, поэтому значения являются списками, а не наборами. В этом случае, приведенный ниже код должен делать эту работу

# returns True if l1 is a "substring sublist" of l2 
def is_substring_sublist(l1, l2): 
    next_idx1s = [0] 
    target_idx = len(l1) 
    for idx2 in range(len(l2)): 
     idx1s = [x for x in next_idx1s] 
     next_idx1s = [0] 

     for idx1 in idx1s: 
      if l1[idx1] in l2[idx2]: 
       next_idx1s.append(idx1+1) 

     if target_idx in next_idx1s: 
      return True 
    return False 

# Unit tests 
list1 = ['a', 'b'] 
list2 = ['b', 'a'] 
list3 = ['c', 'a', 'b', 'd'] 
list4 = ['a', 'a', 'b'] 

assert is_substring_sublist(list1, list1) 
assert not is_substring_sublist(list1, list2) 
assert is_substring_sublist(list1, list3) 
assert is_substring_sublist(list1, list4) 
assert not is_substring_sublist(list2, list4) 
Смежные вопросы