2017-01-05 3 views
1

У меня есть функция, которая принимает ключевое слово в качестве ввода и возвращает список связанных ключевых слов. Мне нужна функция, которая будет получать связанные ключевые слова, а затем снова запускается по каждому ключевому слову в возвращаемом списке и т. Д. Для определенного количества раз.Применить функцию к каждому элементу рекурсии списка

def find_related(kw): 

#magic happens 

return related_kws 

''' 
Example: 

>>>find_related('eat') 
{ 
    'base_kw': 'eat' 
    'related_kws': ['eat pasta', 'eat meat', 'eat fish'] 
} 
''' 

Что мне нужно что-то вроде этого:

def difficult_function(kw, cycles): 

#cycles determines number of times to run recursion 
#magic beyond my league happens... 

return more_related_keywords 

''' 
EXAMPLE #1 

>>>difficult_function('eat', 2) 
{ 
    'base_kw': 'eat' 
    'related_kws': { 
     'eat pasta': ['eat cold pasta', 'eat italian pasta', 'eat instant pasta'], 
     'eat meat': ['eat raw meat', 'eat cow meat', 'eat roasted meat'], 
     'eat fish': ['eat raw fish', 'eat rotten fish', 'eat fresh fish'] 
    } 
} 

''' 

''' 
EXAMPLE #2 

>>>difficult_function('eat', 3) 
{ 
    'base_kw': 'eat' 
    'related_kws': { 
     'eat pasta': { 
      'eat cold pasta': [ 
       'eat cold pasta with sauce', 
       'eat cold pasta and wine', 
       'eat cold pasta at night' 
      ], 
      'eat italian pasta': [ 
       'eat italian cheap pasta', 
       'eat best italian pasta', 
       'eat italian pasta and pesto' 
      ], 
      'eat instant pasta': [ 
       'eat instant pasta snack', 
       'eat instant cheese pasta', 
       'eat healthy instant pasta' 
      ] 
     }, 
     'eat meat': { 
      'eat raw meat': [ 
       'eat raw meat dangerous', 
       'eat raw chicken meat', 
       'eat raw meat with lemon' 
      ], 
      'eat cow meat': [ 
       'eat cow meat and salad', 
       'eat cow meat and rice, 
       'eat cow meat benefits' 
      ], 
      'eat roasted meat': [ 
       'eat roasted meat sandwich', 
       'eat cold roasted meat', 
       'don\'t eat roasted meat' 
      ] 
     }, 
     'eat fish': { 
      'eat raw fish': [ 
       'eat raw fish sushi', 
       'eat raw fish health', 'eat raw fish japanese'], 
      'eat rotten fish': [ 
       'eat rotten fish bacteria', 
       'eat rotten fish death', 
       'eat rotten fish stomach' 
      ], 
      'eat fresh fish': [ 
       'eat fresh fish restaurant', 
       'eat fresh fish with lemon', 
       'eat fresh fish at home'] 
     } 
    } 
} 
''' 

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

РЕДАКТИРОВАТЬ:

Функция ниже имитирует функционирование find_related (кВт). Мои извинения, если этот вопрос не представлены в подходе щего пути, я полный нуб

import string 
import random 

def find_related(kw): 
    # A lot of magic happens, the list comprehension 
    # below simulates the magic 
    related_kws = [ 
     kw + ' ' + ''.join(
      random.choice(string.ascii_lowercase) for 
      _ in range(4)) for i in range(3) 
    ] 

    results = { 
     'base_kw': kw, 
     'related_kws': related_kws 
    } 

    return results 

Mock функцию, которая соответствует примерам, приведенным.

def find_related(kw): 
    '''mock function''' 
    # A lot of magic happens, this simulates the magic 
    d = {'eat': ['eat pasta', 'eat meat', 'eat fish'], 
     'eat pasta': ['eat cold pasta', 'eat italian pasta', 'eat instant pasta'], 
     'eat meat': ['eat raw meat', 'eat cow meat', 'eat roasted meat'], 
     'eat fish': ['eat raw fish', 'eat rotten fish', 'eat fresh fish'], 
     'eat cold pasta': ['eat cold pasta with sauce', 'eat cold pasta and wine', 'eat cold pasta at night'], 
     'eat italian pasta': ['eat italian cheap pasta', 'eat best italian pasta', 'eat italian pasta and pesto'], 
     'eat instant pasta': ['eat instant pasta snack', 'eat instant cheese pasta', 'eat healthy instant pasta'], 
     'eat raw meat': ['eat raw meat dangerous', 'eat raw chicken meat', 'eat raw meat with lemon'], 
     'eat cow meat': ['eat cow meat and salad', 'eat cow meat and rice', 'eat cow meat benefits'], 
     'eat roasted meat': ['eat roasted meat sandwich', 'eat cold roasted meat', 'don\'t eat roasted meat'], 
     'eat raw fish': ['eat raw fish sushi', 'eat raw fish health', 'eat raw fish japanese'], 
     'eat rotten fish': ['eat rotten fish bacteria', 'eat rotten fish death', 'eat rotten fish stomach'], 
     'eat fresh fish': ['eat fresh fish restaurant', 'eat fresh fish with lemon', 'eat fresh fish at home'] 

     } 


    results = { 
     'base_kw': kw, 
     'related_kws': d[kw] 
     } 
+0

Я думаю, нам понадобится более полная спецификация проблемы, чтобы привести вас к решению. Откуда берутся добавленные слова? Должна быть ссылка [«холодная», «итальянская», «мгновенная»] где-нибудь, информация, где требуется вставка, и т. Д. – Prune

+0

Спасибо за ответ. Это довольно большой скрипт, который определяет, какие связанные ключевые слова, основанные на очистке, внутренней базе данных и т. Д. В принципе, вы передаете ей kw, и он вернет список связанных kws. Я редактирую вопрос, чтобы добавить функцию, которая имитирует поведение моей текущей функции. – galatron

+0

Кроме того, полное отсутствие кода подразумевает, что вы не знаете, как выполнять итерацию через свои структуры данных, манипулировать строками и т. Д. Это не помогает ваше дело для получения помощи. – Prune

ответ

1

Вот ответ в случае, если кто-то ищет что-то подобное. Опять мои извинения, если вопрос был плохо представлен.

import pprint 
import string 
import random 

def find_related(kw): 
    # A lot of magic happens, the list comprehension 
    # below simulates the magic 
    related_kws = [ 
     kw + ' ' + ''.join(
      random.choice(string.ascii_lowercase) for 
      _ in range(4)) for i in range(3) 
    ] 
    results = { 
     'base_kw': kw, 
     'related_kws': related_kws 
    } 
    return results 

def difficult_function(kw, cycles):  
    return { 
     'base_kw': kw, 
     'related_kws': rec_kw(kw, cycles) 
    } 

def rec_kw(kw, cycles): 
    if cycles == 1: 
     return find_related(kw) 
    else: 
     result = {} 
     for k in find_related(kw)['related_kws']: 
      result[k] = rec_kw(k, cycles-1) 
     return result 

pprint.pprint(difficult_function('eat', 3)) 
0

Этот код делает то, что вам нужно. Чтобы увидеть результаты, я написал его для работы с глобальным списком INP, но принцип будет работать для вас.

INP = ["Lorem", "Ipsum", "dolor", "atea"] 

def recursive (kw, max, ref=None): 

    ret = None 
    if ref is None: 
     ret = {'base_kw' : kw, 'related_kws' : {}} 
     ref = ret ['related_kws'] 

    if max != 1: 
     words = [' '.join (INP [0: len (INP) - max + 1]), ] 
     for kw in words: 
      ref [kw] = {} 
      ref = ref [kw] 
      recursive (kw, max -1, ref) 
    else: 
     ref [kw] = [' '.join (INP)] 

    return ret 

print (recursive ("Lorem", 3)) 

Это выход:

{'related_kws': {'Lorem Ipsum': {'Lorem Ipsum dolor': {'Lorem Ipsum dolor': ['Lorem Ipsum dolor atea']}}}, 'base_kw': 'Lorem'} 
Смежные вопросы