在多维数组中追加和搜索

Appending and searching in a multidimensional array

所以我的问题是我想将某物的名称附加到数组和一个计数。

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]

现在我想通过我正在计数的事物的名称搜索我的二维数组,并将 1 添加到第二列

test_array['oranges'][1] = test_array['oranges'][1]+1

在将 1 添加到第二列之前,我会测试该项目是否存在

if test_array['string'] != None:
    test_array.append['string', ]

我不确定这是否可行,或者我是否只需要在数组的整个第一列中搜索该项目,然后再添加到列表中。我将对 37,731,481 个项目执行此操作,因此我需要一种方法来搜索希望在 运行 时间内不会二次的字符串,因此我可能只是按字符串对列表进行排序并进行二分搜索。

我建议您使用映射而不是嵌套列表,最好是 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})

而且您不需要测试 add/update 值的键是否存在:

# 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 对象与香草字典不同,对于丢失的键总是 return 零而不是引发 KeyError.

如果您需要管理负计数,Counter 对象将不是最佳选择。您可以使用 collections.defaultdict 对象来代替 default_factory int 函数:

from collections import defaultdict:

dct = defaultdict(int)
...

工作方式与 Counter 相同,但负数现在已得到正确处理。