⑴ union用法!求指點
欄位名不同是可以用 union的,數據類型得一致
⑵ union的用法是節約內存還是方便初始化
都不是。
你得從內存的角度來理解。
比如一個int和一個char[4],如果是
struct{
int a;
char [4] b;
}
那在內存里是這樣的
[ a ][b[3]b[2]b[1]b[0]]
而union則會使這樣的
[ a ]
[b[3]b[2]b[1]b[0]]
至於用處,舉個比較明顯的,base64編碼,是把3個8位共計24位通過移位變為4個6位的數據,再對應編碼。
這樣的運算會有跨邊界問題,如果是char,則有8位,通過位運算顯然有些復雜,那我們就用上面這個共用體,給b[2]b[1]b[0]分別賦值,然後再操作a進行移位操作,這樣既簡單又高效。
至於節約內存之說,主要指有些數據不會同時存在,例如老師沒有成績,學生沒有工資,那麼成績和工資不會同時存在,那就都用一個float的共用體表示,但是實際使用的時候只訪問一個。
至於你說的初始化的問題,在windows下通常使用ZeroMemory(一個memset函數的宏定義)來清零一個內存區域。
共用體有內存對齊問題,這個有興趣自己查找相關資料吧
⑶ python集合的使用怎麼樣的
Python set 集合最常用的操作是向集合中添加、刪除元素,以及集合之間做交集、並集、差集等運算。
向set集合中添加元素
set 集合中添加元素,可以使用 set 類型提供的 add() 方法實現,該方法的語法格式為:
1
setname.add(element)
其中,setname 表示要添加元素的集合,element 表示要添加的元素內容。
需要注意的是,使用 add() 方法添加的元素,只能是數字、字元串、元組或者布爾類型(True 和 False)值,不能添加列表、字典、集合這類可變的數據,否則 Python 解釋器會報 TypeError 錯誤。例如:
1
2
3
4
5
a = {1,2,3}
a.add((1,2))
print(a)
a.add([1,2])
print(a)
運行結果為:
1
2
3
4
5
{(1, 2), 1, 2, 3}
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\1.py", line 4, in
a.add([1,2])
TypeError: unhashable type: 'list'
從set集合中刪除元素
刪除現有 set 集合中的指定元素,可以使用 remove() 方法,該方法的語法格式如下:
1
setname.remove(element)
使用此方法刪除集合中元素,需要注意的是,如果被刪除元素本就不包含在集合中,則此方法會拋出 KeyError 錯誤,例如:
1
2
3
4
5
a = {1,2,3}
a.remove(1)
print(a)
a.remove(1)
print(a)
運行結果為:
1
2
3
4
5
{2, 3}
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\1.py", line 4, in
a.remove(1)
KeyError: 1
⑷ python中空集合是怎麼表示的也請詳細的說下集合的用法!謝謝
集合就是s=set(),s是隨意的字母,下面是集合的用法
len(s)
set 的長度
x in s
測試 x 是否是 s 的成員
x not in s
測試 x 是否不是 s 的成員
s.issubset(t)
s <= t
測試是否 s 中的每一個元素都在 t 中
s.issuperset(t)
s >= t
測試是否 t 中的每一個元素都在 s 中
s.union(t)
s | t
返回一個新的 set 包含 s 和 t 中的每一個元素
s.intersection(t)
s & t
返回一個新的 set 包含 s 和 t 中的公共元素
s.difference(t)
s - t
返回一個新的 set 包含 s 中有但是 t 中沒有的元素
s.symmetric_difference(t)
s ^ t
返回一個新的 set 包含 s 和 t 中不重復的元素
s.update(t)
s |= t
返回增加了 set 「t」中元素後的 set 「s」
s.intersection_update(t)
s &= t
返回只保留含有 set 「t」中元素的 set 「s」
s.difference_update(t)
s -= t
返回刪除了 set 「t」中含有的元素後的 set 「s」
s.symmetric_difference_update(t)
s ^= t
返回含有 set 「t」或者 set 「s」中有而不是兩者都有的元素的 set 「s」
s.add(x)
向 set 「s」中增加元素 x
s.remove(x)
從 set 「s」中刪除元素 x, 如果不存在則引發 KeyError
s.discard(x)
如果在 set 「s」中存在元素 x, 則刪除
s.pop()
刪除並且返回 set 「s」中的一個不確定的元素, 如果為空則引發 KeyError
s.clear()
刪除 set 「s」中的所有元素
⑸ 求助一個Python問題,用字典與集合的知識解下面這個題,感謝大佬幫忙🙏
course1 = set(('李雷', '張玉', '王曉剛', '陳紅靜', '方向', '司馬清'))
course2 = set(('施然', '李芳芳', '劉瀟', '方向', '孫一航', '黃煌'))
course3 = set(('陳紅靜', '方向', '劉培良', '張玉', '施小冉', '司馬清'))
d={}
data=[x for y in [course1,course2,course3]
for x in y]for x in data:
if x in d:
d[x]+=1
else:
d[x]=1
print(d,' ')
print('這個班還有 %d 學生沒有選課(by set)' % (25-len(course1|course2|course3)))
print('這個班還有 %d 學生沒有選課(by dict)' % (25-len(d)))
print('有 %d 位學生同時選修了2門課' % list(d.values()).count(2))
print('有 %d 位學生同時選修了3門課' % list(d.values()).count(3))
print('有 %d 位學生同時選修了1門課' % list(d.values()).count(1))
⑹ Python中的變數名case和union哪個是合法的啊
都是合理的
⑺ Python的集合有哪些操作
集合是一個無序的,不重復的數據組合,它有著兩個主要作用:去重以及關系測試。去重指的是當把一個列表變成了集合,其中重復的內容就自動的被去掉了
關系測試指的是,測試兩組數據之間的交集、差集、並集等關系。
去重測試代碼如下:
#創建一個列表--裡面存在一些重復值
test_list = [1,2,3,4,2,2,3,4,3,2,3,4]
#利用集合將列表中重復的內容去掉
test_list = set(test_list)
#列印測試並且查看test_list被賦予新值後的數據類型print(test_list,type(test_list)) # {1, 2, 3, 4}
Tip:需要注意的是,集合和字典一樣都是無序的。
獲取交集需要使用集合中的方法intersection方法,獲取兩個集合中的交集代碼如下:
#創建兩個集合,並且獲取集合的交集
test_list_01 = set(['YanYan','LiBai','LuLu','YangMi'])
test_list_02 = set(['YanYan','LiuDeHua','ZhangXueYou','LiBai'])
#在上面的兩個集合中,存在相同的值,那麼現在我們取出兩個集合中的交集
test_intersection = test_list_01.intersection(test_list_02)print(test_intersection) # {'YanYan', 'LiBai'}
獲取並集的方式需要採用集合中union方法,獲取兩個集合的並集代碼如下:
#創建兩個集合,並且獲取集合的交集
test_list_01 =set(['YanYan','LiBai','LuLu','YangMi'])
test_list_02 =set(['YanYan','LiuDeHua','ZhangXueYou','LiBai'])
#採用集合中的union方法獲取並集
test_list_union = test_list_01.union(test_list_02)
print(test_list_union) # {'LiBai', 'LuLu', 'ZhangXueYou', 'LiuDeHua', 'YangMi', 'YanYan'}
獲取差集的方式要採用集合中的difference方法,獲取兩個集合的差集的代碼如下所示:
#創建兩個集合,並且獲取集合的交集
test_list_01 = set(['YanYan','LiBai','LuLu','YangMi'])
test_list_02 = set(['YanYan','LiuDeHua','ZhangXueYou','LiBai'])
#使用集合中的difference方法來獲取差集
test_difference = test_list_01.difference(test_list_02)
test_difference2 = test_list_02.difference(test_list_01)
print(test_difference) # {'LuLu', 'YangMi'}print(test_difference2) # {'ZhangXueYou', 'LiuDeHua'}
判斷一個集合是否是另外一個集合的子集可以使用issubset()方法,同樣,還可以使用issuperset()方法判斷一個集合是否是另外一個集合的父級
代碼如下:
#創建兩個集合
list_set = set([1,2,3,4])
list_son = set([2,3])
#判斷list_son是否是list_set的子集print(list_son.issubset(list_set)) # True#判斷list_set是否是list_son的父級print(list_set.issuperset(list_son)) # True
對稱差集(又有人稱之為叫做反向差集),指的是取出兩個集合中互相都沒有的值取出放在一個集合中。
代碼如下:
#創建兩個集合
list_set_num1 = set([1,3,5,7,9])
list_set_num2 = set([2,3,4,6,9,10])
#獲取兩個集合的對稱差集print(list_set_num1.symmetric_difference(list_set_num2)) # {1, 2, 4, 5, 6, 7, 10}
如果上述的難以理解的話,可以對對稱差集理解為去掉兩個集合中都存在的內容,將剩餘的內容取到一個新的集合中。
除了上述的這些方法實現的關系功能之外,還有一個方法isdisjoint(),功能是判斷兩個集合中是否有相同的值,如果兩個集合中沒有相同的值(即沒有交集),那麼返回True
代碼如下:
#創建集合
test_set_num1 = set([1,2,3,4])
test_set_num2 = set([5,6,7,8])
test_set_num3 = set([1,3,7,8])
#使用isdisjoint()方法來判斷print(test_set_num1.isdisjoint(test_set_num2)) # Trueprint(test_set_num1.isdisjoint(test_set_num3)) # False
通過運算符來進行關系測試
在上面的應用中,主要是通過python中的方法進行的關系測試,那麼在python中,除了使用方法以外,還可以使用關系運算符來進行關系測試。
實例代碼如下:
test_list_01 =set(['YanYan','LiBai','LuLu','YangMi'])
test_list_02 =set(['YanYan','LiuDeHua','ZhangXueYou','LiBai'])
#獲取交集&print(test_list_01 & test_list_02) # {'LiBai', 'YanYan'}
#獲取並集|print(test_list_01 | test_list_02) # {'LuLu', 'LiBai', 'LiuDeHua', 'YanYan', 'ZhangXueYou', 'YangMi'}
#獲取差集-print(test_list_01 - test_list_02) # {'LuLu', 'YangMi'}print(test_list_02 - test_list_01) # {'LiuDeHua', 'ZhangXueYou'}
#獲取對稱差集print(test_list_01 ^ test_list_02) # {'ZhangXueYou', 'YangMi', 'LuLu', 'LiuDeHua'}
集合的增刪改查
添加
語法:Set.add()
代碼如下:
#創建一個集合
test_set =set(['YanYan'])
#添加
test_set.add('LiBai') #添加一項
test_set.update(['LuLu','JingJing']) #一次性向集合中添加多項
#輸出集合
print(test_set) #{'YanYan', 'LuLu', 'LiBai', 'JingJing'}
刪除
刪除集合中的某一個元素可以使用remove方法
代碼如下:
#創建一個集合
test_set = set(['YanYan'])
#使用remove方法刪除元素
test_set.remove('YanYan')print(test_set) # set()
刪除項目除了使用remove以外,還可以使用pop()方法,但是pop()方法刪除內容不能夠指定,只是隨機刪除。
pop方法會把刪除的內容返回,示例代碼如下:
#創建一個集合
test_set = set([20,9,'a',1,2,3,4])print(test_set.pop()) # 1print(test_set.pop()) # 2print(test_set.pop()) # 3
刪除元素還可以使用discard()方法,這個方法沒有返回值,如果列印返回值的話會輸出None
#創建一個集合
test_list = set([1,2,3,4,5])
#使用discard()方法刪除--注意,discard()方法刪除返回None,也就是沒有返回值print(test_list.discard(3)) # None#此時原集合中的3已經被刪除了print(test_list) # {1, 2, 4, 5}
查詢
xins #判斷x是否是s的成員
xnotins 判斷x是否是s的成員
len(x) #查看x的長度
s <= t #測試是否s中的每一個元素都在t中
s >= t #測試是否t中的每一個元素都在s中
⑻ 怎麼用python實現兩個文件逐行計算兩個區間的並集
有時候,為來了需求,需要統計兩個 list 之間的交集,並集,差集。查詢了一些資料,現在源總結在下面:
1. 獲取兩個list 的zd交集
#方法一:
a=[2,3,4,5]
b=[2,5,8]
tmp = [val for val in a if val in b]
print tmp
#[2, 5]
#方法二
print list(set(a).intersection(set(b)))
2. 獲取兩個list 的並集
print list(set(a).union(set(b)))
3. 獲取兩個 list 的差集
print list(set(b).difference(set(a))) # b中有而a中沒有的
⑼ 關於python ctypes里 Union的問題
DataValue(Structure):
_anonymous_ = ('DataValue',)
可能是寫錯了,改成:
class DataValue(Structure):
_anonymous_ = ('DataValue',)
data_value.DataValue = 23
這句報錯嗎?
換成:
data_value.i4Val = 32
試試
如果有問題,希望你把錯誤的原因(traceback)貼出來
⑽ union用法
聯合體內存就是成員里最大的類型值的大小。
很顯然這個聯合體里 double是最大的,佔8個位元組,所以這個聯合體就是8位元組大小。
把double變數=1.2345;,然後輸出的就是這個聯合體內存里存儲16進制數值,也就是這個1.2345的數值。
如果還不清楚,就看下聯合體的概念!~