2015-03-20 2 views
10

Sono un principiante in python. Voglio sapere se c'è qualche in-built funzione o altro modo in modo da poter ottenere di seguito in python 2.7:Python: Iterate su ogni elemento in elenco-elenco-nidificato e sostituisce elementi specifici

Trova tutti i -Lettera nella lista e sottoelenco e sostituirla con [ 'non', la lettera]

ad esempio: trovare tutti gli elementi nella lista qui sotto che iniziano con - e sostituirli con [ 'non', lettera]

Input : ['and', ['or', '-S', 'Q'], ['or', '-S', 'R'], ['or', ['or', '-Q', '-R'], '-S']] 
Output : ['and', ['or', ['not','S'], 'Q'], ['or', ['not','S'], 'R'], ['or', ['or', ['not','Q'], ['not','R']], ['not','S']]] 

qualcuno può suggerire come farlo in python. Grazie

risposta

9

provare un po 'di ricorsione:

def change(lol): 
    for index,item in enumerate(lol): 
     if isinstance(item, list): 
      change(item) 
     elif item.startswith('-'): 
      lol[index] = ['not',item.split('-')[1]] 
    return lol 

In azione:

In [24]: change(['and', ['or', '-S', 'Q'], ['or', '-S', 'R'], ['or', ['or', '-Q', '-R'], '-S']]) 
Out[24]: 
['and', 
['or', ['not', 'S'], 'Q'], 
['or', ['not', 'S'], 'R'], 
['or', ['or', ['not', 'Q'], ['not', 'R']], ['not', 'S']]] 
2

È necessario utilizzare un function.The ricorsiva isinstance(item, str) controlla semplicemente per vedere se un oggetto è stringa.

def dumb_replace(lst): 
    for ind, item in enumerate(lst): 
     if isinstance(item, str): 
      if item.startswith('-'): 
       lst[ind] = ['not', 'letter'] 
     else: 
      dumb_replace(item) 

E:

dumb_replace(Input) 

Dà:

['and', ['or', ['not', 'letter'], 'Q'], ['or', ['not', 'letter'], 'R'], ['or', ['or', ['not', 'letter'], ['not', 'letter']], ['not', 'letter']]] 
1

Sulla base di una ricetta trovata here:

def nested_list_replacer(seq, val = '-S', sub = ['not', 'letter']): 
    def top_kill(s): 
     for i in s: 
      if isinstance(i, str): 
       if i == val: 
        i = sub 
       yield i 
      else:     
       yield type(i)(top_kill(i)) 

    return type(seq)(top_kill(seq))   


l = ['and', ['or', '-S', 'Q'], ['or', '-S', 'R'], ['or', ['or', '-Q', '-R'], '-S']] 
print(nested_list_replacer(l, '-S')) 
print(nested_list_replacer(l, '-Q')) 

Dà:

['and', ['or', ['not', 'letter'], 'Q'], ['or', ['not', 'letter'], 'R'], ['or', ['or', '-Q', '-R'], ['not', 'letter']]] 
['and', ['or', '-S', 'Q'], ['or', '-S', 'R'], ['or', ['or', ['not', 'letter'], '-R'], '-S']]