所以我的问题是我想在数组中添加某个名称和计数。
test_array = []
test_array.append(['apples', 2])
test_array.append(['oranges', 5])
test_array.append(['bananas', 1])
print(*test_array)
['apples', 2]
['oranges', 5]
['bananas', 1]
现在我想通过我正在计算的东西的名称搜索我的2d数组,并将第1列添加到第1列
test_array['oranges'][1] = test_array['oranges'][1]+1
在将第1列添加1之前,我会测试项目是否存在
if test_array['string'] != None:
test_array.append['string', ]
我不确定这是否可行,或者我是否只需要在追加到列表之前搜索数组的整个第一列。我将为37,731,481个项目执行此操作,因此我需要一种方法来搜索希望在运行时不是二次方的字符串,所以我可能只是按字符串对列表进行排序并进行二分查找。
答案 0 :(得分:1)
我建议您使用映射而不是嵌套列表,最好是collections.Counter
对象。项目将是密钥,它们的计数将是值。然后可以在恒定时间内搜索密钥 - O (1)。
from collections import Counter
dct = Counter()
dct['apples'] = 2
dct['oranges'] = 5
dct['bananas'] = 1
print dct
# Counter({'oranges': 5, 'apples': 2, 'bananas': 1})
您无需测试密钥存在以添加/更新值:
# updating a key (which is not in the counter)
dct['mango'] += 3
print dct
# Counter({'oranges': 5, 'apples': 2, 'mango': 3, 'bananas': 1})
这是因为collections.Counter
对象不像vanilla dicts总是为丢失的键返回零而不是引发 KeyError 。
如果您需要管理负数,Counter
对象将不是最佳选择。您可以使用collections.defaultdict
对象而不是 default_factory int
函数:
from collections import defaultdict:
dct = defaultdict(int)
...
与Counter
的工作方式相同,但现在可以正确处理负数。