Python:迭代嵌套列表中的每个项目并替换特定项目

时间:2015-03-20 04:52:54

标签: python python-2.7 nested-lists

我是python的初学者。我想知道是否有任何内置函数或其他方式,所以我可以在python 2.7中实现:

在列表和子列表中找到所有 -letter ,并将其替换为 [' not',letter]

例如:查找下面列表中以 - 开头的所有项目,并将其替换为[' not',letter]

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

任何人都可以建议如何在python中做到这一点。 感谢

3 个答案:

答案 0 :(得分:9)

尝试一下递归:

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

答案 1 :(得分:2)

您需要使用递归函数。isinstance(item, str)只是检查项目是否为字符串。

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)

dumb_replace(Input)

给出:

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

答案 2 :(得分:1)

根据找到的食谱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'))

给出:

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