必须有更好/更有效的方法来做到这一点。如果第一个字符串匹配,我想增加一个变量;如果第二个变量匹配第二个字符串,我想增量。
ifCount = 0
elseCount = 0
for x in dict:
if x["bla"] == 'this':
ifCount += 1
elif x["bla"] == 'that':
elseCount += 1
from collections import Counter
from operator import itemgetter
items = [
{"bla": "this"},
{"bla": "this"},
{"bla": "that"},
{"bla": "that"},
{"bla": "that"},
{"bla": "that"},
{"bla": "this"},
{"bla": "that"}
]
counter = Counter(map(itemgetter("bla"), items))
print(counter["this"])
print(counter["that"])
输出:
3
5
>>>
就效率而言,您的代码没有任何问题。它简明扼要,重复一次。如果你想把它缩短一点,我们可以用filter
。
ifCount = len(filter(lambda x: x['bla'] == 'this', dict))
elseCount = len(filter(lambda x: x['bla'] == 'this', dict))
它更短,但可读性是高还是低还存在争议。这种语法在更大的代码库中可能是有意义的,其中lambda
实际上是一些经常使用和众所周知的函数,但在这个孤立的例子中,我认为for
循环更可读。
;明显的";处理这个问题的方法是使用dict来计算出现次数。首先,将现有可迭代的名称从dict
更改为可用的名称,比如d
。。。
只需使用Counter对象。
from collections import Counter
label_count = Counter(entry["bla"] for entry in d)
label_count
现在包含d
中所有"bla"
条目的计数,特别是this
和that
的计数。如果您只想要多个元素中的两个,则可以添加子句if entry["bla"] in ["this", "that"]
。