python list重复元素_Python将两个或多个list中有重复的元素合成一个list

本文主要介绍Python中,将大量多个的list,其中有重复元素,或者交集的元素的list合成一个,没有的不变。

Python中,list这种数据结构很常用到,如果两个或者多个list结构相同,内容类型相同,我们通常会将两个或者多个list合并成一个,这样我们再循环遍历的时候就可以一次性处理掉了。所以如何将两个或者多个list合并成一个就是我们接下来要讲的内容。

示例效果:

[[1,2],[3,4,5],[0,4]] 会成为 [[1,2],[0,3,4,5]

[[1],[1,2],[0,2]] 会成为 [[0,1,2]]

[[1, 2], [2, 3], [3, 4]] 会成为 [[1,2,3,4]]

1、使用itertools实现

from itertools import combinations

def bfs(graph, start):

visited, queue = set(), [start]

while queue:

vertex = queue.pop(0)

if vertex not in visited:

visited.add(vertex)

queue.extend(graph[vertex] - visited)

return visited

def connected_components(G):

seen = set()

for v in G:

if v not in seen:

c = set(bfs(G, v))

yield c

seen.update(c)

def graph(edge_list):

result = {}

for source, target in edge_list:

result.setdefault(source, set()).add(target)

result.setdefault(target, set()).add(source)

return result

def concat(l):

edges = []

s = list(map(set, l))

for i, j in combinations(range(len(s)), r=2):

if s[i].intersection(s[j]):

edges.append((i, j))

G = graph(edges)

result = []

unassigned = list(range(len(s)))

for component in connected_components(G):

union = set().union(*(s[i] for i in component))

result.append(sorted(union))

unassigned = [i for i in unassigned if i not in component]

result.extend(map(sorted, (s[i] for i in unassigned)))

return result

print(concat([[1, 2], [3, 4, 5], [0, 4]]))

print(concat([[1], [1, 2], [0, 2]]))

print(concat([[1, 2], [2, 3], [3, 4]]))

输出:

[[0, 3, 4, 5], [1, 2]]

[[0, 1, 2]]

[[1, 2, 3, 4]]

20021919494664.png

2、迭代方法实现

original_list = [[1,2],[3,4,5],[0,4]]

mapping = {}

rev_mapping = {}

for i, candidate in enumerate(original_list):

sentinel = -1

for item in candidate:

if mapping.get(item, -1) != -1:

merge_pos = mapping[item]

#update previous list with all new candidates

for item in candidate:

mapping[item] = merge_pos

rev_mapping[merge_pos].extend(candidate)

break

else:

for item in candidate:

mapping[item] = i

rev_mapping.setdefault(i, []).extend(candidate)

result = [list(set(item)) for item in rev_mapping.values()]

print(result)

输出:

[[1, 2], [0, 3, 4, 5]]

20021919491278.png

logo.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值