2017-02-20 10 views
0

У меня есть файл в качестве словаря слова:Как пропустить слова нет в словаре

water=45 
melon=8 
apple=35 
pineapple=67 
I=43 
to=90 
eat=12 
tastes=100 
sweet=21 
it=80 
watermelon=98 
want=70 
juice=88 

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

I want to eat banana and watermelon 
I want drink juice purple and pineapple 

Я хочу вывести:

43, 70, 90, 12, 98 
43, 70, 88, 67 

Каждое слово, которое не существует в словаре, находится в пропуске.

Это то, что я до сих пор:

import re 
f = open(r'C:\Users\dinesh_pundkar\Desktop\val.txt','r') 
val_dict = {} 
for line in f: 
    k, v = line.strip().split('=') 
    val_dict[k.strip()] = v.strip() 
f.close() 


h = open(r'C:\Users\dinesh_pundkar\Desktop\str_txt.txt','r') 
str_list = [] 
for line in h: 
    str_list.append(str(line).strip()) 



tmp_str = '' 
for val in str_list: 
    tmp_str = val 
    for k in val_dict.keys(): 
      if k in val: 
       replace_str = str(val_dict[k]).strip() + "," 
       tmp_str= re.sub(r'\b{0}\b'.format(k),replace_str,tmp_str,flags=re.IGNORECASE) 

    tmp_str = tmp_str.strip(",") 
    print val, " = ", tmp_str 
    tmp_str = '' 

Выход:

43, 70, 90, 12, banana and 98 
43, 70, drink 88, purple and 67 

ответ

0

Во-первых, w e может проанализировать ваш «словарь-файл» в реальном словаре Python, используя умное понимание dict.

In [1]: dict_file = """water=45 
    ...: melon=8 
    ...: apple=35 
    ...: pineapple=67 
    ...: I=43 
    ...: to=90 
    ...: eat=12 
    ...: tastes=100 
    ...: sweet=21 
    ...: it=80 
    ...: watermelon=98 
    ...: want=70 
    ...: juice=88""" 

In [2]: conversion = {k: int(v) for line in dict_file.split('\n') for (k,v) in (line.split('='),)} 

In [3]: conversion 
Out[3]: 
{'I': 43, 
'apple': 35, 
'eat': 12, 
'it': 80, 
'juice': 88, 
'melon': 8, 
'pineapple': 67, 
'sweet': 21, 
'tastes': 100, 
'to': 90, 
'want': 70, 
'water': 45, 
'watermelon': 98} 

Затем мы устанавливаем фразу переменной.

In [4]: text = "I want to eat banana and watermelon" 

Мы можем использовать str.split изменить одну строку в список слов.

In [5]: text.split() 
Out[5]: ['I', 'want', 'to', 'eat', 'banana', 'and', 'watermelon'] 

Чтобы проверить, если каждое слово в словаре conversion, мы можем просто использовать in ключевое слово, которое проверяет ключи словаря.

In [6]: "banana" in conversion 
Out[6]: False 

In [7]: "watermelon" in conversion 
Out[7]: True 

Мы можем реализовать это в понимании списка, чтобы фильтровать только слова, которые наш словарь конверсий знает, как преобразовать в число.Мы также можем искать значение conversion[word], которое, как мы знаем, существует, потому что мы уже подтвердили, что понимание понимает только значения, которые находятся в конверсии dict.

In [9]: [str(conversion[word]) for word in text.split() if word in conversion] 
Out[9]: ['43', '70', '90', '12', '98'] 

Наконец, мы можем использовать str.join объединить этот список обратно в одну строку. (Квадратные скобки удаляются, что делает выражение А генератор понимания, а не список понимания, но это работает так или иначе.)

In [10]: ', '.join(str(conversion[word]) for word in text.split() if word in conversion) 
Out[10]: '43, 70, 90, 12, 98' 

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

Здесь нет необходимости в регулярном выражении; Возможности строковой обработки Python очень мощные. :)

+0

Я пытался запустить код, но вывод не выполняется ..., это его код [ссылка] (http://www.tutorialspoint.com/execute_python_online.php?PID=0Bw_CjBb95KQMZDI2MDhaV2FZZFE) –

+0

@RiskaNanda Вы скопировали созданный IPython '...:'; если вы удалите их, это сработает. :) –

+0

Я удалил его, но результаты остались прежними. [Link] (http://www.tutorialspoint.com/execute_python_online.php?PID=0Bw_CjBb95KQMczl4VXJXTDVYa0U) –

0

Вы можете сделать что-то вроде этого, используя list comprehension для того, чтобы ваш желаемый результат:

Я m, если ваш файл словаря называется file1, а ваш второй файл называется file2.

data1 = [k.rstrip().split("=") for k in open("file1", 'r')] 
data2 = [k.rstrip().split() for k in open("file2", 'r')] 

for k in data2: 
    for j in k: 
     for m in data1: 
      if j == m[0]: 
       print(m[1], end = ' ') 
    print() 

Выход:

43 70 90 12 98 
43 70 88 67 
+0

Я хочу вывести соответствующее предложение в файле2. –

+0

Я обновил свой ответ. У вас может быть желаемый результат. –

1

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

>>> d = {'a': 1, 'b': 2} 
>>> d['c'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'c' 

>>> d.get('c', 'fallback value') 
'fallback value' 

Это позволит вам сделать что-то вроде:

nums = [dict.get(val, '') for val in str_list] 
# [43, 70, 90, 12, '', '', 98] 

Затем удалите пустые строки с filter

nums = filter(None, nums) 
# with `None` as the first argument, this removes all elements that eval to False 

Затем карту в строку и присоединиться запятыми

print(", ".join(map(str, nums))) 
+0

У меня ошибка: TypeError: дескриптор 'get' требует объекта 'dict', но получил 'str', это не словарь python по умолчанию, я делаю словарь вручную в текстовом файле. –

+0

@RiskaNanda мой код предполагает, что вы уже обработали текстовый файл в словаре, как вы уже делали в своем собственном коде. При необходимости я могу привести полный пример. –

+0

Я все еще немного смущен, как применить его. Можете ли вы привести полный пример? –

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

  • Нет связанных вопросов^_^