Python:遍历列表和子列表并匹配第一个元素并进行更多操作

时间:2015-03-21 04:04:42

标签: python python-2.7

我是python的新手,所以想知道python 2.7中是否有内置函数或其他方法:

遍历列表和子列表,如果第一个元素的值与第一个子列表元素的值匹配,则删除第一个子列表元素,并将其他元素放在子列表中的外部列表中。为所有子列表执行此操作。请参阅以下示例以更好地了解我的要求。

示例:

Input  : ['or', ['or', 'R', '-B'], 'W']
Output : ['or', 'R', '-B', 'W']

此处,'或','或'在主列表和子列表中匹配,因此删除子列表中的'或',并将其他元素放入主列表中的子列表'R'和'-B'

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

此处,'和','和'在主列表和子列表中匹配

Input : ['and', ['and', ['or', 'A', 'C'], ['or', 'A', 'D']], ['and', ['or', 'B', 'C'], ['or', 'B', 'D']]]
Output : ['and', ['or', 'A', 'C'], ['or', 'A', 'D'], ['or', 'B', 'C'], ['or', 'B', 'D']] 

这里,'和','和'在主列表和子列表1中匹配,因此在子列表1中删除'和',并将其他元素放在主列表中的子列表1中。主列表和子列表2中的'和','和'匹配,因此在子列表2中删除'和',并将其他元素放在主列表中的子列表中。

希望我用例子清楚地解释我的问题

谢谢!

1 个答案:

答案 0 :(得分:2)

这两个工作:一个是递归的,一个不是。但是,他们为列表工作,这很烦人。如果我切换到检查iterables,那么他们会吃掉字符串。我马上就会找到一个很好的解决方法。

def condense(l):
    outp = [l[0]] 
    for x in l[1:]:
        if isinstance(x,list) and x[0]==l[0]:
            outp += x[1:]
        else:
            outp.append(x)
    return outp
def condense_r(l):
    outp = [l[0]] 
    for x in l[1:]:
        if isinstance(x,list):
            z = condense_r(x)
            if z[0]==l[0]:
                outp += z[1:]
            else:
                outp.append(z)
        else:
            outp.append(x)
    return outp

基本上,这些只是通过并检查你在说什么。


更新

如果您宁愿能够对通用序列进行操作,那么这将起作用:它检查它是否是序列,然后确保它不是字符串:

import collections
def condense(l):
    outp = [l[0]] 
    for x in l[1:]:
        if isinstance(x,collections.Sequence) \
            and not isinstance(x,basestring) and x[0]==l[0]:
            outp += x[1:]
        else:
            outp.append(x)
    return outp
def condense_r(l):
    outp = [l[0]] 
    for x in l[1:]:
        if isinstance(x,collections.Sequence) and not isinstance(x,basestring):
            z = condense_r(x)
            if z[0]==l[0]:
                outp += z[1:]
            else:
                outp.append(z)
        else:
            outp.append(x)
    return outp