如何在Python3中初始化和增加列表中未定义的值?

2024-09-27 23:27:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个单词字典,我正在生成包含 (1) 原词(如猫) (2) 按字母顺序排列的单词(例如acst) (3) 单词的长度

在不知道最长单词的长度的情况下,是否可以创建一个数组(或者在Python中,创建一个列表),以便在我浏览字典时,将一个包含x个字符的对象追加到array[x]中的列表中?在

例如,当我遇到单词“a”时,它会将生成的对象追加到数组[1]的列表中。接下来,对于aardvark,if将把生成的对象追加到数组[8]的列表中,以此类推

我想创建一个大小为1的数组,然后再加上它,但我不确定它将如何工作。在

例如:对于第一个单词a,它将把它附加到数组[1]中存储的列表中。然而,对于下一个词,土豚,我应该如何检查/生成更多的点,直到它达到8?如果我附加到数组,我需要给append函数一个参数。但是,我不能给它任何参数,因为我不想更改以前输入的值(例如数组[1]中的“a”)。在

我正在为一个作业优化我的代码,所以另一种方法是在我确定最长的单词后再次检查列表。然而,我认为最好是在我按字母顺序排列单词和创建对象时这样做,这样我就不必翻阅冗长的词典两次了。在

另外,关于语法的快速问题:listofsuff[x].append(y)将用值y初始化/追加到listofsuff中值x处的列表,对吗?在


Tags: 对象列表参数字典字母情况数组单词
1条回答
网友
1楼 · 发布于 2024-09-27 23:27:12

将长度存储为dict中的键而不是列表中的索引。如果您使用collections模块中的defaultdict,这非常简单-您的算法如下所示:

from collections import defaultdict
results = defaultdict(list)
for word in words:
   results[len(word)].append(word)

这与您的第二个问题有关:listOfStuff[x].append(y)将附加到一个已经存在于listofStuff[x]的列表中。如果还没有初始化到一个(可能是空的)列表,它将而不是创建一个新的。如果x不是列表的有效索引(例如,x=3到listofsuflength 2中),则会得到一个索引器错误。如果它存在,但是那里有另一个列表之外的其他东西,您可能会得到AttributeError。在

使用dict可以解决第一个问题-分配给不存在的dict键总是有效的。使用defaultdict扩展了这一思想,使之也可以从一个不存在的键中读取——它将在您创建defaultdict时,通过调用您给defaultdict的函数(在本例中,我们给了它list,因此它调用它并获得一个空列表)在您第一次使用它时将其插入dict中。在


如果由于某种原因不能使用集合,那么下一个最好的方法仍然是使用dict—它们有一个名为setdefault的方法,其工作原理与defaultdicts类似。你可以这样使用它:

^{pr2}$

如您所见,setdefault接受两个参数:一个键和一个默认值。如果dict中已经存在该键,setdefault只返回它的当前值,就像您已经完成了results[key]。但是,如果这是一个错误,它会将第二个参数插入字典中该键处,然后返回它。这比defaultdict使用起来有点笨拙,但是当您的默认值是一个空列表时,它在其他方面是相同的(但是,defaultdict更好的方法,因为它只根据需要调用factory函数,但您需要预计算它以传入setdefault)。在


从技术上讲,可以用嵌套列表来实现这一点,但这很难看。你必须:

  • 检测列表不够大的情况
  • 计算出列表还需要多少元素
  • 将列表扩大到该大小

完成第一位的最python方法是捕捉错误(如果setdefault和defaultdict不存在,您也可以用dicts来做这件事)。整个事情看起来是这样的:

results = []
for word in words:
    try:
        results[len(word)]
    except IndexError:
        # Grow the list so that the new highest index is 
        # len(word)
        new_length = len(word) + 1
        difference = len(results) - new_length
        results.extend([] for _ in range(difference))
    finally:
        results[len(word)].append(word)

保持口述以避免这种混乱。列表是专门针对以下情况进行优化的:任何元素的精确数字索引在列表之外没有意义,这不符合您的用例。当你的代码需要做什么和你所使用的数据结构不匹配时,这种类型的代码是很常见的,值得尽早学习如何避免它。在

相关问题 更多 >

    热门问题