我拥有的是一个单词词典,我正在生成包含以下内容的对象 (1) 原词(如猫) (2) 按字母顺序排列的词(例如 acst) (3)词长
在不知道最长单词的长度的情况下,是否可以创建一个数组(或者,在 Python 中,一个列表),当我扫描字典时,它将一个包含 x 个字符的对象附加到列表中数组[x]?
例如,当我遇到单词“a”时,它会将生成的对象追加到数组[1] 的列表中。接下来,对于 aardvark,if 会将生成的对象附加到数组 [8] 等处的列表。
我考虑过创建一个大小为 1 的数组然后添加到它,但我不确定它是如何工作的。
例子:对于第一个单词 a,它会将其附加到存储在数组 [1] 中的列表中。但是,对于下一个词 aardvark,我应该如何检查/在列表中生成更多点直到它达到 8?如果我追加到数组,我需要给追加函数一个参数。但是,我不能只给它任何参数,因为我不想更改以前输入的值(例如数组 [1] 中的“a”)。
我正在尝试优化我的作业代码,因此替代方案是在我确定最长的单词后第二次遍历列表。但是,我认为这样做会更好,因为我按字母顺序排列单词并创建对象,这样我就不必两次翻阅冗长的字典。
此外,关于语法的快速问题:listOfStuff[x].append(y) 将初始化/追加到 listOfStuff 中的值 x 和值 y 的列表,正确吗?
最佳答案
将长度存储为字典中的键而不是列表中的索引。如果您使用集合模块中的 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 到长度为 2 的 listOfStuff),您将得到一个 IndexError。如果它存在但那里有其他列表以外的东西,你可能会得到一个 AttributeError。
使用字典可以解决第一个问题——分配给一个不存在的字典键总是有效的。使用 defaultdict
将这个想法扩展到还从一个不存在的键中读取 - 它将插入一个默认值,该默认值是通过调用您在创建时为 defaultdict 提供的函数来提供的(在这种情况下,我们给了它 list
,所以它会在您第一次使用它时调用它并得到一个空列表)到字典中。
如果由于某种原因你不能使用集合,下一个最好的方法仍然是使用字典——他们有一个名为 setdefault
的方法,它的工作方式类似于 defaultdicts。你可以像这样使用它:
results = {}
for word in words:
results.setdefault(len(word), []).append(word)
如您所见,setdefault 有两个参数:一个键和一个默认值。如果键已经存在于字典中,setdefault 只返回它的当前值,就像您完成了 results[key]
一样。但是,如果这是一个错误,它会将第二个参数插入字典中该键的位置,然后返回它。这比 defaultdict 使用起来有点笨拙,但是当你的默认值是一个空列表时,它在其他方面是相同的(defaultdict is 更好地使用当你的默认值创建起来很昂贵,但是,因为它仅在需要时调用工厂函数,但您需要预先计算它以传递给 setdefault)。
用嵌套列表在技术上是可以做到这一点,但它很难看。你必须:
- 检测列表不够大的情况
- 算出列表还需要多少元素
- 将列表扩大到该大小
最 Pythonic 的方法是捕捉错误(如果 setdefault 和 defaultdict 不存在,你也可以用字典来做)。整个事情看起来像这样:
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)
继续使用字典以避免这种困惑。列表专门针对任何元素的确切数字索引在列表之外没有意义的情况进行了优化,这不符合您的用例。当您的代码需要执行的操作与您正在使用的数据结构擅长的操作不匹配时,这种类型的代码非常常见,并且值得尽早学习如何避免它。
关于python - 如何在 Python 3 的列表中初始化和递增未定义的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585693/