Python 如何操作声明为“self.tab[(&&&&&&&&';,0)]”的数组,而不明确知道它包含什么?

Python 如何操作声明为“self.tab[(&&&&&&&&';,0)]”的数组,而不明确知道它包含什么?,python,arrays,Python,Arrays,我正在用python编写一段代码,从文件中读取每个字符并保存其出现次数。由于这是一项家庭作业,我不允许更改数组的声明方式 数组的声明方式如下: def __init__(self): self.tab = [('_', 0)] * 100 self.size = 0 现在,每次我读一个字符,我都会检查我是否已经注意到它: def add(self, c): # c is the character that was read for i

我正在用python编写一段代码,从文件中读取每个字符并保存其出现次数。由于这是一项家庭作业,我不允许更改数组的声明方式

数组的声明方式如下:

    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(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


我不希望得到一个能给我具体情况的确切答案。我所需要的只是一套关于如何在这种情况下工作的规则和示例

要检查您的角色是否已出现在选项卡中,您可以使用以下方法:

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.

正如我在评论中提到的,对于这个问题来说,这不是一个很好的数据结构

首先,元组是不可变的,即它们不能被更新。要更改其中一个
self.tab
元组中的字符串或整数,基本上需要创建一个新元组并替换原始元组。因此,用100个元组初始化列表并没有多大意义,这些元组将被丢弃。其次,对列表进行线性扫描以查找匹配字符是没有效率的

在Python中执行此任务的明智方法是使用集合模块中定义的计数器类。然而,使用普通字典或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)

请注意,此代码不会添加在输入中找到的任何
字符。大概,
\uu
用于指示空表槽;在Python中更常见的是使用空字符串,
None
,或者可能是sentinel对象(例如
object
的实例)。

请发布正确的代码。什么是x,什么是ch in add()?首先,使用tuple保存经常更改的值是个坏主意,但这不是我的事。2.您正在迭代您的选项卡,以便检查char是否只访问第一个元素,如下面的
self.tab[x][0]==ch
这样的
self.tab[x]=(self.tab[x][0],self.tab[x][1]+1)
@Edward No,这不起作用,因为元组是不可变的(这就是为什么使用元组的原因)。坦率地说,对于这个任务来说,这是一个非常糟糕的数据结构。除了元组问题,除非列表非常小,否则对列表进行线性扫描以查找匹配字符是没有效率的。使用二分法可以更有效地搜索有序列表,但这会增加不必要的复杂性。在Python中实现这一点的明智方法是使用
collections
模块中定义的计数器类。要“手动”完成这项任务,你应该使用字典。你是否考虑过一位新的讲师,他选择的示例将真正帮助你发展使用Python的能力,而不是沉溺于Python的琐事中?这种方法效率更低:
.index
方法必须进行另一次线性扫描(尽管是C速度)在表中查找元组的索引。如果我理解正确,使用元组进行索引的方法非常低效,尽管它确实有效。“我说得对吗?”爱德华:的确!在Python中可能有更糟糕的方法来实现这一点,但我很难想到它们这对我的导师来说是非常令人放心的!无论如何,谢谢你的回答!