首页 新闻 会员 周边 捐助

【python】如何把前面3个元素做为key合并多个列表?

0
[已解决问题] 解决于 2018-02-07 12:56

把列表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']

恳请大神不吝赐教!

芽衣的主页 芽衣 | 菜鸟二级 | 园豆:384
提问于:2018-02-07 11:02
< >
分享
最佳答案
0

下面的可以实现,可能代码有点丑:

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']]]
奖励园豆:5
BUTTERAPPLE | 老鸟四级 |园豆:3190 | 2018-02-07 12:12

谢谢你的热心回复。

不会丑啊,我觉得你写的代码很美。

芽衣 | 园豆:384 (菜鸟二级) | 2018-02-07 12:55

请问一下,这个方法只能用于相同的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

芽衣 | 园豆:384 (菜鸟二级) | 2018-02-07 15:37

@徐池俊: 这个错误的原因是 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 | 园豆:3190 (老鸟四级) | 2018-02-07 15:45

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

芽衣 | 园豆:384 (菜鸟二级) | 2018-02-07 16:10

@徐池俊: 你这个就需要列表中嵌套列表再进行判断了。逻辑写起来就会有点复杂了。

BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2018-02-07 16:11

@徐池俊: 如果你需要全部判断的话,就要把每个list 中的element 进行再次遍历,判断。相当于再次重复 combine_list 函数。

BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2018-02-07 16:12

@BUTTERAPPLE: 好的,谢谢你的热心回答!

芽衣 | 园豆:384 (菜鸟二级) | 2018-02-07 16:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册