最近有一個問題,&在兩個計數器上使用正確的答案,然后“做對了”,這讓我很驚訝。
從檔案:
計數器支持等式、子集和超集關系的豐富比較運算子:==、!=、<、<=、>、>=。所有這些測驗都將缺失元素視為計數為零,因此 Counter(a=1) == Counter(a=1, b=0) 回傳 true。
但這并沒有涉及到&. 我寫了一個小測驗腳本:
from collections import Counter
from pprint import pp
cls = Counter # `dict` fails: TypeError: unsupported operand type
o1 = cls(a=1,b=2,c=3,de=3,f=3,i1=9)
o2 = cls(a=1,b=2,c=3,de=5,f=6,i2=9)
res = o1 & o2
pp(dict(o1=o1,o2=o2,res=res))
輸出是:
{'o1': Counter({'i1': 9, 'c': 3, 'de': 3, 'f': 3, 'b': 2, 'a': 1}),
'o2': Counter({'i2': 9, 'f': 6, 'de': 5, 'c': 3, 'b': 2, 'a': 1}),
'res': Counter({'c': 3, 'de': 3, 'f': 3, 'b': 2, 'a': 1})}
在我看來,這counter1 & counter2意味著:
- 計算兩者的鍵的交集。
- 對于公共鍵上的值,計算
min
我對么?除了Counter和之外set,是否還定義了任何其他標準庫資料結構__and__(IIRC 的后盾&)?
uj5u.com熱心網友回復:
你的理解是非常正確的。如果你從參考的地方往下看幾行,你會看到一個使用&on Counterobjects 的示例——你不需要深入到源代碼中來找到它:
交集和并集回傳相應計數的最小值和最大值。...
>>> c & d # intersection: min(c[x], d[x]) Counter({'a': 1, 'b': 1}) >>> c | d # union: max(c[x], d[x]) Counter({'a': 3, 'b': 2})
uj5u.com熱心網友回復:
容器檔案狀態:
提供了幾種數學運算來組合 Counter 物件以生成多重集(計數大于零的計數器)。加法和減法通過增加或減少相應元素的計數來組合計數器。交集和并集回傳相應計數的最小值和最大值。平等和包容比較相應的計數。每個操作都可以接受帶符號計數的輸入,但輸出將排除計數為零或更少的結果。
為了解決您關于其他 dict 衍生物覆寫的問題&,我不這么認為。但是,set(此處的檔案)使用&、和來實作交集、并集、差異和對稱差異|。-^
uj5u.com熱心網友回復:
根據官方檔案:
>>> c = Counter(a=3, b=1) >>> d = Counter(a=1, b=2) >>> c d # add two counters together: c[x] d[x] Counter({'a': 4, 'b': 3}) >>> c - d # subtract (keeping only positive counts) Counter({'a': 2}) >>> c & d # intersection: min(c[x], d[x]) Counter({'a': 1, 'b': 1}) >>> c | d # union: max(c[x], d[x]) Counter({'a': 3, 'b': 2}) >>> c == d # equality: c[x] == d[x] False >>> c <= d # inclusion: c[x] <= d[x] False
一元操作也被定義:
>>> c = Counter(a=2, b=-4) >>> c Counter({'a': 2}) >>> -c Counter({'b': 4})
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/477310.html
上一篇:根據字典向資料框添加列
