2017-07-17 107 views
1

所以我的问题是,我想追加一个名称的东西到一个数组,并计数。追加和搜索多维数组

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

+0

我想你需要在追加之前搜索整个数组的第一列。看起来好像字典可能会是一个更好的数据结构:https://docs.python.org/3/tutorial/datastructures.html#dictionaries –

回答

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对象总是丢失的钥匙返回零,而不是养KeyError

如果您需要管理负数,Counter对象不是最佳选择。你可以使用一个collections.defaultdict对象,而不是使default_factoryint功能:

from collections import defaultdict: 

dct = defaultdict(int) 
... 

的工作方式为Counter除了负计数现在正确处理相同。