1
f = open("sonad.txt",encoding="utf-8")
c = f.readlines()
blokk = [[]] * 15
for read in c:
    length = len(read.strip())
    blokk[length].append(read.strip())

sonad.txt 只有一些随机单词,我想将它们按如下顺序排列:

所有 1 个字母长的单词转到 blokk[1] 2 个字母长的转到 blokk[2] 等等......

但是我当前的代码所做的是它向 allL block[x] 添加了一个元素,因此 blokk[1] blokk[2] blokk[3] ..... 都是一样的。

4

2 回答 2

7

该行blokk = [[]] * 15创建了一个列表,其中包含15 次相同的空列表

您想改用列表推导:

blokk = [[] for _ in range(15)]

自己试试吧:

>>> blokk = [[]]*15
>>> blokk
[[], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
>>> blokk[0].append(1)
>>> blokk
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
>>> blokk = [[] for _ in range(15)]
>>> blokk
[[], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
>>> blokk[0].append(1)
>>> blokk
[[1], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
于 2012-10-09T12:45:07.977 回答
4
 blokk = [[]]*15

创建对同一列表的15 个引用。因此,如果您附加到blokk[0]or block[1],这些更改将反映在任一列表中,因为它们是同一个列表。

也许这里更好的数据结构是defaultdict

from collections import defaultdict
d = defaultdict(list)
with open('sonad.txt', encoding='utf-8') as fin:
    for line in fin:
        stripped = line.strip()
        d[len(stripped)].append(stripped)

print(sorted(d.items()))
于 2012-10-09T12:44:37.787 回答