2016-09-19 60 views
2

我在python中編寫代碼,它將讀取文件中的每個字符並保存其出現次數。由於這是一個作業分配,我不能改變陣列的聲明方式。如何在不明確知道它包含什麼的情況下操作聲明爲self.tab [('_',0)]`的數組?

的陣列以這種方式宣告:

def __init__(self): 
     self.tab = [('_', 0)] * 100 
     self.size = 0 

現在,我每次讀取一個字符的時候,我檢查wheter我已經注意到了這一點與否:

def add(self, c): # c is the character that was read 

    for i in range(0,self.size): 
     if self.tab[i] == (c,): # this is where my problem occurs. 
            #How should should I check if the 
            #character given as an argument is 
            #present in the array I declared 
            #before? 

      self.tab[i] = ?  #Here I want to add 1 to the number 
            #of occurrences of the character. 
            #How should I do it? 
     else: 
      pass 

正如我在說這個問題,我不知道角色等於什麼,第二列等於多少。我希望能夠在不知道有多少事件的情況下將事件數量加1。

我不希望有一個答案能給我確切的解決方案,以適應我的特殊情況。我需要的只是一套規則和例子,就如何在這種情況下工作。

+0

請發佈正確的代碼。什麼是x,add()中的ch是什麼? – Humbalan

+1

首先,使用元組來保存常常會改變的值是個壞主意,但這不是我的bussines。 2.你正在迭​​代你的選項卡,以檢查是否發生char只是訪問像這樣的第一個元素'self.tab [x] [0] == ch' –

+0

@Take_Care很好,這回答了我的一個問題。所以,爲了改變出現的值,我所要做的就是寫'self.tab [x] [1] + = 1'? –

回答

4

正如我在評論中提到,這是而不是一個偉大的數據結構,用於這個問題。首先,元組是不可變的,即它們不能被更新。要更改其中一個元組中的字符串或整數,您基本上需要創建一個新元組並替換原來的元組。因此,用100個將被丟棄的元組初始化列表確實沒什麼意義。其次,對列表進行線性掃描以查找匹配字符效率不高。

在Python中完成此任務的明智方式是使用集合模塊中定義的Counter類。但是,使用普通字典或defaultdict來實現它也很容易。

但無論如何,下面是使用問題中給出的數據結構來完成它的一種方法。

class CharCounter(object): 
    def __init__(self): 
     self.tab = [('_', 0)] * 100 
     self.size = 0 

    def add(self, c): # c is the character that was read 
     for i in range(1 + self.size): 
      ch, count = self.tab[i] 
      if ch == c: 
       self.tab[i] = (c, count + 1) 
       break 
     else: 
      self.tab[self.size] = (c, 1) 
      self.size += 1 

# test 
counter = CharCounter() 
for c in 'this is a test': 
    counter.add(c) 

for i in range(counter.size): 
    print(i, counter.tab[i]) 

輸出

0 ('t', 3) 
1 ('h', 1) 
2 ('i', 2) 
3 ('s', 3) 
4 (' ', 3) 
5 ('a', 1) 
6 ('e', 1) 

注意,這個代碼添加在輸入中找到的任何字符_。據推測,_正被用來指示一個空的表格槽;在Python中更常用的是使用空字符串None或者可能是一個哨兵對象(例如object的實例)。

+0

如果我理解正確,那麼用元組來做這件事的方式是非常低效的,儘管它確實有效。我是對的? –

+1

@愛德華:的確如此! Python中可能會有更糟糕的方法,但我很難考慮它們。 :) –

+0

對於我的導師來說,這非常令人放心!無論如何,謝謝你的回答! –

0

要檢查你的性格是在標籤已經存在,你可以使用類似:

found_char = [arr_item for arr_item in self.tab if arr_item[0]==c] 

和檢查返回值:

if found_char == []: 
    # add a new entry in your tab using the self.size attribute. 
else: 
    # use self.tab.index(...) to find the corresponding tupple in self.tab and 
    # replace it by a modified one as tupple are immutable. 
+2

這種方法效率更低:'.index'方法必須執行另一個線性掃描(儘管以C速度)來查找表中的元組索引。 –

相關問題