2015-03-20 17 views
10

Tôi là người mới bắt đầu trong python. Tôi muốn biết nếu có bất kỳ trong xây dựng chức năng hoặc cách nào khác để tôi có thể đạt được dưới đây trong python 2.7:Python: Lặp lại từng mục trong danh sách lồng nhau trong danh sách và thay thế các mục cụ thể

Tìm tất cả -letter trong danh sách và sublist và thay thế bằng [ 'không', thư]

Ví dụ: Tìm tất cả các mục trong danh sách bên dưới bắt đầu - và thay thế chúng với [ 'không', thư]

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']]] 

bất cứ ai có thể đề xuất làm thế nào để làm điều đó trong python. Cảm ơn

Trả lời

9

Hãy thử một chút đệ quy:

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 

Trong hành động:

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

Bạn cần phải sử dụng một function.The đệ quy isinstance(item, str) chỉ đơn giản là kiểm tra xem một mục là chuỗi.

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) 

Và:

dumb_replace(Input) 

Cung cấp:

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

Dựa trên một công thức tìm thấy 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')) 

Cung cấp:

01.
['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']] 
Các vấn đề liên quan