题目
第一小队有五名队员,序号是1,2,3,4,5; 第二小队也有五名队员,序号6,7,8,9,10。
输入一个得票队员的编号的字符串,求第一、二小队没有得票的队员。在一行中输入得票的队员的序列号,用逗号隔开。
输入格式:
在一行中输入得票的队员的序列号,用逗号隔开。
输出格式:
在第一行中输出第一小队没有得票的队员序号,用空格分开;
在第二行中输出第二小队没有得票的队员序号,用空格分开。
输入样例:
1,5,9,3,9,1,1,7,5,7,7,3,3,1,5,7,4,4,5,4,9,5,10,9
输出样例:
2
6 8
思路
使用集合,利用集合操作符运算出,第一、二小队没有得票的队员。
集合
&:交集运算,使用 & 连接多个集合,可获得交集部分,即相同的元素。
| :并集运算,使用 | 连接多个集合 , 得到全部集合中全部的元素。
+:合并集合
-:差集
^:异或集,获取只在一个集合中出现的元素
<:x<z,x是z的真子集或z是x的真超集,则返回True
>:x>z, z是x的真子集或x是z的真超集,则返回True
<=:x<=z,x是z的子集或z是x的超集,则返回True
>=:x>=z, z是x的子集或x是z的超集,则返回True
真子集
真子集:即不包括集合本身的所有子集
示例:
x={'d', 'b', 'a', 'c'}
s={'d','b'}
s<x
#-->True
x={'d', 'b', 'a', 'c'}
s={'d','b','c','a'}
s<x
#-->False
子集
如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集
任何一个集合是它本身的子集
空集是任何集合的子集
用 <= 或 issubset() 方法
示例:
x={'d', 'b', 'a', 'c'}
s={'d','b'}
print(s<=x)
#-->True
x={'d', 'b', 'a', 'c'}
s={'d','b','c','a'}
print(s<=x)
#-->True
实现
初步实现
代码:
set1=set([1,2,3,4,5])
set2=set([6,7,8,9,10])
ticketSet=set(map(int,input().split(',')))
noTicketInFirst=set1-(set1&ticketSet)
noTicketInSec=set2-(set2&ticketSet)
for elem in noTicketInFirst:
print(elem,end=" ")
print()#Default this end char is /n
for elem in noTicketInSec:
print(elem,end=" ")
结果
2
8 6
上面的实现正确得到的了第一、二小队没有得票的队员。
优化
要实现与题目一模一样的即可我们还需要删除最后元素的空格,以及对最终结果进行排序。
代码:
set1=set([1,2,3,4,5])
set2=set([6,7,8,9,10])
ticketSet=set(map(int,input().split(',')))
noTicketInFirst=sorted(list(set1-(set1&ticketSet)))
noTicketInSec=sorted(list(set2-(set2&ticketSet)))
noTicketInFirstStr=""
noTicketInSecStr=""
for elem in noTicketInFirst:
noTicketInFirstStr+=(str(elem)+" ")
for elem in noTicketInSec:
noTicketInSecStr+=(str(elem)+" ")
noTicketInFirstStr=noTicketInFirstStr.strip()
noTicketInSecStr=noTicketInSecStr.strip()
print(noTicketInFirstStr)
print(noTicketInSecStr,end="")
结果
2
6 8