根据列表的第一个元素组合列表

时间:2015-07-23 02:48:59

标签: python

我有一个清单说

 chain=[[0, 102], [1, 88], [1, 98],[1, 34],[2, 38], [2, 52],[2,15], [3, 26, 9],[3,5,6],[43, 88], [43, 98], [45, 100], [54, 9], [57, 26, 9], [62, 98]]

我想通过删除重复的数字将组合列表从0,1,2 ...等开始,如[1,88,98,34],[2,38,52,15],[3, 26,9,5,6]等我试过

c1=[]
c2=[]
for i in chain:
    for e in chain:       
        if(e!=i):
            if(i[0]==e[0]):
                c1=i
                c2=e
                c2.remove(c2[0])
                c1+=c2
                chain.remove(i)
                chain.remove(e)
                fam.append(c1)
 print(fam)

我得到的是

 [[1, 88, 98], [2, 38, 52], [3, 26, 9, 5, 6], [16, 88, 98], [43, 88, 98]]
每次c1用i更新时,它只会结合两个列表....对不起,如果我问愚蠢的问题.....请纠正我。

3 个答案:

答案 0 :(得分:3)

我推荐一本字典。

result = {}
chain =  chain=[[0, 102], [1, 88], [1, 98],[1, 34],[2, 38], [2, 52],[2,15], [3, 26, 9],[3,5,6],[43, 88], [43, 98], [45, 100], [54, 9], [57, 26, 9], [62, 98]]
for item in chain:
    if item[0] in result:
        result[item[0]].append(item[1])
    else:
        result[item[0]] = [item[1]]

>>> print(*result.items(), sep='\n')
(0, [102])
(1, [88, 98, 34])
(2, [38, 52, 15])
(3, [26, 5])
(54, [9])
(57, [26])
(43, [88, 98])
(45, [100])
(62, [98])

如果需要,可以将其转换为list

result_list = [[k] + result[k] for k in sorted(result)]

>>> print(*result_list, sep='\n')
[0, 102]
[1, 88, 98, 34]
[2, 38, 52, 15]
[3, 26, 5]
[43, 88, 98]
[45, 100]
[54, 9]
[57, 26]
[62, 98]

答案 1 :(得分:3)

尝试itertools.groupby

from itertools import groupby
some_groups = [(key, list(val)) 
               for key, val in groupby(chain, lambda x: x[0])]

#some_groups:
#[(0, [[0, 102]]),
# (1, [[1, 88], [1, 98], [1, 34]]),
# (2, [[2, 38], [2, 52], [2, 15]]),
# (3, [[3, 26, 9], [3, 5, 6]]),
# (43, [[43, 88], [43, 98]]),
# (45, [[45, 100]]),
# (54, [[54, 9]]),
# (57, [[57, 26, 9]]),
# (62, [[62, 98]])]

然后你可以按照自己的意愿形成结果

results = []
for key, groups in some_groups:
    unique_vals = set(  s for sublist in groups for s in sublist[1:]   )
    results.append( [key]+ list(unique_vals) )

#results:
#[[0, 102],
# [1, 88, 98, 34],
# [2, 52, 38, 15],
# [3, 9, 26, 5, 6],
# [43, 88, 98],
# [45, 100],
# [54, 9],
# [57, 9, 26],
# [62, 98]]

更新

结果似乎只包含由2个或更多列表组合而成的列表。这可以通过在追加

之前检查长度来解决
some_groups = [(key, list(val)) 
               for key, val in groupby(chain, lambda x: x[0])]
some_groups = [ (key,groups) for key,groups in some_groups if len(groups) > 1 ] #remove e.g. (0, [[0, 102]] ) from some_groups  

答案 2 :(得分:0)

如果您想要一个不同的项目列表,则应考虑set

>>> chain=[[0, 102], [1, 88], [1, 98],[1, 34],[2, 38], [2, 52],[2,15], [3, 26, 9],[3,5,6],[43, 88], [43, 98], [45, 100], [54, 9], [57, 26, 9], [62, 98]]
>>> set(n for sublist in chain for n in sublist)
set([0, 1, 98, 3, 100, 38, 102, 9, 2, 34, 15, 6, 43, 52, 54, 57, 88, 45, 26, 62, 5])
>>>