首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:迭代嵌套列表列表中的每个项并替换特定项。

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

Stack Overflow用户
提问于 2015-03-20 04:52:54
回答 3查看 3.4K关注 0票数 10

我是蟒蛇的初学者。我想知道是否有内置的函数或其他方式,这样我就可以在python 2.7中实现以下功能:

在列表和子列表中查找所有-letter,并将其替换为'not',字母

在下面的列表中找到所有以字母开头的项目,并将它们替换为“否”。

代码语言:javascript
复制
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']]]

有人能建议在蟒蛇身上怎么做吗。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-20 05:11:17

尝试一下递归:

代码语言:javascript
复制
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

在行动中:

代码语言:javascript
复制
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']]]
票数 9
EN

Stack Overflow用户

发布于 2015-03-20 05:22:34

您需要使用递归的function.The isinstance(item, str),只需检查条目是否为字符串。

代码语言:javascript
复制
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)

和:

代码语言:javascript
复制
dumb_replace(Input)

给予:

代码语言:javascript
复制
['and', ['or', ['not', 'letter'], 'Q'], ['or', ['not', 'letter'], 'R'], ['or', ['or', ['not', 'letter'], ['not', 'letter']], ['not', 'letter']]]
票数 2
EN

Stack Overflow用户

发布于 2015-03-20 05:26:45

基于这里的食谱

代码语言:javascript
复制
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'))

给予:

代码语言:javascript
复制
['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']]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29159657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档