我有一個帶有布爾屬性的物件串列。
我想根據這個布爾屬性來計算這些物件 - 不包括在內。
標準庫中是否有比完全寫出回圈來迭代它們更高效、更簡潔或更 Pythonic 的函式?
Counter似乎并不合適,這也不該解決的問題-據我可以告訴。
class MyObject():
def __init__(self, moniker, booleanVariable):
self.name = moniker
self.state = booleanVariable
def _myCounterMethod(list):
# code goes here
return counts
myList = []
myList.append(MyObject("objectOne", True))
myList.append(MyObject("objectTwo", False))
myList.append(MyObject("objectThree", None))
counts = _MyCounterMethod(myList)
print(counts)
>>>[('True', 1), ('False', 1), ('None', 1)]
我目前的解決方案:
def _myCounterMethod(list):
trueCount = 0
falseCount = 0
noneCount = 0
for obj in list:
if obj.state == True:
trueCount = 1
elif obj.state == False:
falseCount = 1
elif obj.state == None:
noneCount = 1
countsList = [('True', trueCount), ('False', falseCount), ('None', noneCount)]
return countsList
uj5u.com熱心網友回復:
您已經了解了Counter基于方法的方法,這里是您所擁有的簡單縮短:
def _myCounterMethod(lst): # do not shadow `list`
trueCount = falseCount = noneCount = 0
for obj in lst:
trueCount = obj.state is True
falseCount = obj.state is False
noneCount = obj.state is None
return [('True', trueCount), ('False', falseCount), ('None', noneCount)]
對于我對最佳方法的看法:
from collections import Counter
from operator import attrgetter
def _myCounterMethod(lst):
return Counter(map(attrgetter("state"), lst)).most_common()
# already a list of tuples
僅當您真正需要列印時才將您擁有的任何內容轉換為字串。
uj5u.com熱心網友回復:
我建議你實作 .count() 方法
def counter(l):
iter = [x.state for x in l]
return ('True', iter.count(True)), ('False', iter.count(False)), ('None', iter.count(None))
>>> counter(myList)
(('True', 1), ('False', 1), ('None', 1))
uj5u.com熱心網友回復:
使用collections.Counter:
import collections
class MyObject():
def __init__(self, moniker, booleanVariable):
self.name = moniker
self.state = booleanVariable
my_list = [MyObject("objectOne", True), MyObject("objectTwo", False), MyObject("objectThree", None)]
counts = collections.Counter(str(e.state) for e in my_list)
print(counts)
輸出
Counter({'True': 1, 'False': 1, 'None': 1})
如果需要嚴格列出輸出,請執行以下操作:
result = list(counts.items())
print(result)
輸出
[('True', 1), ('False', 1), ('None', 1)]
uj5u.com熱心網友回復:
下面似乎作業
from collections import defaultdict
data = defaultdict(int)
class MyObject():
def __init__(self, moniker, booleanVariable):
self.name = moniker
self.state = booleanVariable
myList = []
myList.append(MyObject("objectOne", True))
myList.append(MyObject("objectTwo", False))
myList.append(MyObject("objectThree", None))
for o in myList:
data[str(o.state)] = 1
print(data)
輸出
defaultdict(<class 'int'>, {'True': 1, 'False': 1, 'None': 1})
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315533.html
