用python源代码写两个集合,集合A:{1,2,3,4,5}集合B:{4,5,6,7,8}。计算这两个集合的差集、并集和交集
时间: 2023-12-10 15:03:45 浏览: 30
好的,我来为您解答。
您可以使用 Python 的 set 类型来表示集合。以下是代码实现:
```python
setA = {1, 2, 3, 4, 5}
setB = {4, 5, 6, 7, 8}
# 计算差集
diffSet = setA - setB
print("A - B =", diffSet)
# 计算并集
unionSet = setA | setB
print("A ∪ B =", unionSet)
# 计算交集
intersectSet = setA & setB
print("A ∩ B =", intersectSet)
```
输出结果为:
```
A - B = {1, 2, 3}
A ∪ B = {1, 2, 3, 4, 5, 6, 7, 8}
A ∩ B = {4, 5}
```
这样,我们就得到了两个集合的差集、并集和交集。
相关问题
python语言实现求两个单链表的差集源代码
实现求两个单链表的差集,即找出在第一个链表中出现但不在第二个链表中出现的元素。下面是Python语言的源代码实现:
```python
class Node:
def __init__(self, value):
self.value = value
self.next = None
def getDifferenceList(head1, head2):
# 用两个集合分别存储链表1和链表2的元素
set1 = set()
set2 = set()
# 遍历链表1,将元素添加到集合set1中
p1 = head1
while p1:
set1.add(p1.value)
p1 = p1.next
# 遍历链表2,将元素添加到集合set2中
p2 = head2
while p2:
set2.add(p2.value)
p2 = p2.next
# 用集合操作求两个集合的差集
differenceSet = set1.difference(set2)
# 将差集转换成链表返回
differenceList = None
for value in differenceSet:
newNode = Node(value)
if not differenceList:
differenceList = newNode
else:
p = differenceList
while p.next:
p = p.next
p.next = newNode
return differenceList
```
以上代码的思路是先遍历链表,将链表中的元素分别添加到两个集合中,然后利用集合操作求两个集合的差集,最后将差集转换为链表返回。使用示例代码如下:
```python
# 创建链表1:1->2->3->4->5
head1 = Node(1)
head1.next = Node(2)
head1.next.next = Node(3)
head1.next.next.next = Node(4)
head1.next.next.next.next = Node(5)
# 创建链表2:3->4->6->7
head2 = Node(3)
head2.next = Node(4)
head2.next.next = Node(6)
head2.next.next.next = Node(7)
# 求差集
differenceList = getDifferenceList(head1, head2)
# 输出差集链表的元素:1 2 5
p = differenceList
while p:
print(p.value, end=' ')
p = p.next
```
输出结果为:1 2 5,表示在链表1中出现但不在链表2中出现的元素为1、2和5。
python找出最小生成树的n-1条边源代码
以下是使用Prim算法和Kruskal算法找出最小生成树的n-1条边的Python代码。
使用Prim算法:
```python
import heapq
def prim(n, edges):
# 初始化节点和边的信息
graph = [[] for _ in range(n)]
for a, b, w in edges:
graph[a].append((b, w))
graph[b].append((a, w))
# 初始化起点和已访问的节点
start = 0
visited = set([start])
# 初始化边的堆
edges = graph[start]
heapq.heapify(edges)
# 初始化最小生成树的边集合和权值
mst_edges = []
mst_weight = 0
# 执行Prim算法
while len(mst_edges) < n - 1:
# 从堆中取出距离当前集合最近的边
w, u = heapq.heappop(edges)
if u not in visited:
# 将该边加入到最小生成树的边集合中
mst_edges.append((u, w))
mst_weight += w
# 将该节点加入到已访问的节点中,并将其相邻的边加入到堆中
visited.add(u)
for v, w in graph[u]:
if v not in visited:
heapq.heappush(edges, (w, v))
return mst_edges, mst_weight
```
使用Kruskal算法:
```python
def kruskal(n, edges):
# 初始化父节点
parent = [i for i in range(n)]
# 定义并查集的操作
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
def union(x, y):
px, py = find(x), find(y)
if px != py:
parent[px] = py
# 对边按照权值从小到大排序
edges.sort(key=lambda x: x[2])
# 初始化最小生成树的边集合和权值
mst_edges = []
mst_weight = 0
# 执行Kruskal算法
for a, b, w in edges:
if find(a) != find(b):
# 如果该边的两个端点不在同一个连通分量中,就将其加入到最小生成树的边集合中
mst_edges.append((a, b, w))
mst_weight += w
union(a, b)
if len(mst_edges) == n - 1:
break
return mst_edges, mst_weight
```
以上代码中,n表示节点的数量,edges是一个列表,其中每个元素是一个三元组(a, b, w),表示节点a和节点b之间有一条权值为w的边。mst_edges是最小生成树的边集合,mst_weight是最小生成树的权值。