把列表o中的前三列元素(cmd,opt,xx.x(x)SE)作为key,合并第4列(Catxxxx)的元素。
下面的例子是由列表o创建新的列表o_new。
o = []
a = ['cmd',['opt1','opt2'],'12.2(2)SE','Cat3560']
b = ['cmd',['opt1','opt2'],'12.2(2)SE','Cat4500']
c = ['cmd',['opt1','opt2','opt3','opt4'],'12.3(2)SE','Cat3560']
d = ['cmd',['opt1','opt2','opt3'],'12.4(2)SE','Cat3560']
o.append(a)
o.append(b)
o.append(c)
o.append(d)
想要的结果:
o_new[0] = ['cmd',['opt1','opt2'],'12.2(2)SE',['Cat3560','Cat4500']] → 这个是由a,b合并成的
o_new[1] = ['cmd',['opt1','opt2','opt3','opt4'],'12.3(2)SE','Cat3560']
o_new[2] = ['cmd',['opt1','opt2','opt3'],'12.4(2)SE','Cat3560']
恳请大神不吝赐教!
下面的可以实现,可能代码有点丑:
def combine_list(list1, list2):
list0 = list1[:]
if list1[0] == list2[0] and list1[1] == list2[1] and list1[2] == list2[2]:
list_temp = [list1[3], list2[3]]
list0[3] = list_temp
return list0
else:
pass
o = []
a = ['cmd', ['opt1', 'opt2'], '12.2(2)SE', 'Cat3560']
b = ['cmd', ['opt1', 'opt2'], '12.2(2)SE', 'Cat4500']
c = ['cmd', ['opt1', 'opt2', 'opt3', 'opt4'], '12.3(2)SE', 'Cat3560']
d = ['cmd', ['opt1', 'opt2', 'opt3'], '12.4(2)SE', 'Cat3560']
o.append(a)
o.append(b)
o.append(c)
o.append(d)
o_new = o[:]
i = 1
j = 0
for i in range(i, len(o)):
temp = combine_list(o[j], o[i])
if temp is not None:
o_new.append(temp)
o_new.remove(o[j])
o_new.remove(o[i])
if i == 3:
j += 1
i = 1
if j == 3:
break
print(o_new)
Result:
[['cmd', ['opt1', 'opt2', 'opt3', 'opt4'], '12.3(2)SE', 'Cat3560'], ['cmd', ['opt1', 'opt2', 'opt3'], '12.4(2)SE', 'Cat3560'], ['cmd', ['opt1', 'opt2'], '12.2(2)SE', ['Cat3560', 'Cat4500']]]
谢谢你的热心回复。
不会丑啊,我觉得你写的代码很美。
请问一下,这个方法只能用于相同的key是两个的情况吗?如果添加了新的一行就会报错
添加的内容:
e = ['cmd', ['opt1', 'opt2'], '12.2(2)SE', 'Cat4600']
o.append(e)
报错信息:
Traceback (most recent call last):
File "OStest.py", line 32, in <module>
o_new.remove(o[j])
ValueError: list.remove(x): x not in list
@徐池俊: 这个错误的原因是 list里面没有那个元素,你可以再写个方法判断是否有该元素,如果有的话,就移除。
if temp is not None:
o_new.append(temp)
try:
o_new.remove(o[j])
o_new.remove(o[i])
catch ValueError:
//Do Something..
@BUTTERAPPLE:
列表结合的时候,好像只能两两结合,结合结果:
['cmd', ['opt1', 'opt2'], '12.2(2)SE', ['Cat3560', 'Cat4500']]
['cmd', ['opt1', 'opt2'], '12.2(2)SE', ['Cat4500', 'Cat4600']]
实际上想要的结果是:
['cmd', ['opt1', 'opt2'], '12.2(2)SE', ['Cat3560', 'Cat4500', 'Cat4600']]
@徐池俊: 你这个就需要列表中嵌套列表再进行判断了。逻辑写起来就会有点复杂了。
@徐池俊: 如果你需要全部判断的话,就要把每个list 中的element 进行再次遍历,判断。相当于再次重复 combine_list 函数。
@BUTTERAPPLE: 好的,谢谢你的热心回答!