在多维数组中追加和搜索

时间:2017-07-17 17:00:29

标签: python multidimensional-array nested-lists dynamic-arrays

所以我的问题是我想在数组中添加某个名称和计数。

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个项目执行此操作,因此我需要一种方法来搜索希望在运行时不是二次方的字符串,所以我可能只是按字符串对列表进行排序并进行二分查找。

1 个答案:

答案 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的工作方式相同,但现在可以正确处理负数。