我是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中删除'和',并将其他元素放在主列表中的子列表中。
希望我用例子清楚地解释我的问题
谢谢!
答案 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