我有一个清单说
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更新时,它只会结合两个列表....对不起,如果我问愚蠢的问题.....请纠正我。
答案 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)
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])
>>>