2015-09-02 3 views
-1

Я пытаюсь искать слова из файла и добавлять полученные слова из каждой строки в Tuple. И затем я хочу найти пересекающиеся слова из двух кортежей list_1 и list_2. Но я получаю error-Пересечение Python из 2 кортежей UNICODE/Список

TypeError: unhashable тип: 'список'

# -*- coding: utf-8 -*- 

импорт повторно

list_1 = []

list_2 = []

файл данных = открыт (filename)

для строки1 в файле данных:

if '1st word to be searched' in line1: 
    s = line1 
    left, right = re.findall(r'(\S+\s+\S+)\s+1stWordToBeSearched\s+(\S+\s+\S+)', s)[0] 
    set1 = {left, right} 

    list_1.extend([left,right]) 
    list_1 = list(list_1) 

datafile1 = открыт (имя файла)

для line2 в datafile1:

if ' 2nd word to be searched' in line2: 
    s = line2 
    left, right = re.findall(r'(\S+\s+\S+)\s+2ndWordTbeSearched\s+(\S+\s+\S+)', s)[0] 
    set2 = {left, right} 

    list_2.extend([left,right]) 
    list_2 = list(list_2) 

результат = set1.intersection (SET2)

печати (результат)

в первом for loop - «findall» выполняет поиск предложений со словом «число». И затем находит слова слева и справа от слова «число». И Создает list-

list_1 = [о, а, в, элементы]

в секунду для петлям FindAll ищет слово "современный". и дает слова левым и правым. И создает 2-й list-

list_2 = [о, все, элементы, являются]

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

Когда получаются списки_1 и list_2, должны быть получены слова, общие в них. Обратите внимание: файл НЕ является английским. Он находится на другом языке.

+0

Каждый из списков содержат * другой * список. Вы имели в виду использовать 'list.extend()' вместо 'list.append()' вместо этого, возможно? –

+0

Я пытался использовать .extend(), но он дает мне пустой набор() – Trish

ответ

0

Вы добавить один список объектов для каждого из ваших списков:

list_1.append([left,right]) 

и

list_2.append([left,right]) 

Это дает [[left, right]] для обоих списков, так что вы пытаетесь поставить вложенную [left, right] список в набор как один элемент.

Обычно, если вы хотите добавить несколько элементов в существующий список, вы бы использовать list.extend():

list_1.extend([left, right]) 

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

left, right = re.findall(r'(\S+\s+\S+)\s+1stWordToBeSearched\s+(\S+\s+\S+)', s)[0] 
set1 = {left, right} 

left, right = re.findall(r'(\S+\s+\S+)\s+2ndWordToBeSearched\s+(\S+\s+\S+)', s)[0] 
set2 = {left, right} 

result = set1.intersection(set2) 

Обратите внимание, что вы игнорируете все, кроме первых двух слов! Вы используете [0], чтобы получить первый результат списка findall().

Если вы хотите, чтобы создать пересечение всех слов, вы можете использовать набор понимание, чтобы извлечь все слова в набор:

set1 = {word for matched in re.findall(r'(\S+\s+\S+)\s+1stWordToBeSearched\s+(\S+\s+\S+)', s) 
      for word in matched} 

set1 = {word for matched in re.findall(r'(\S+\s+\S+)\s+2ndWordToBeSearched\s+(\S+\s+\S+)', s) 
      for word in matched} 

result = set1.intersection(set2) 
+0

To Martijn Pieters- Я получаю пустой набор() – Trish

+0

@Trish: тогда нет пересечения между этими двумя наборами, просто так. –

+0

Нет, нет! 4 слова похожи, но я не получаю выход. – Trish

0

Там у вас есть список внутри списка. почини это.

result = set(list_1).intersection(list_2) 

множество ([]) = Ok множество ([[], []]) = Failed, потому что список не может быть хэшируются

+0

Тогда что мне делать? Я использовал 'tuple' – Trish

+0

Попробуйте это, https://docs.python.org/2/library/itertools.html#itertools.chain –

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