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 文字の長さのすべての単語はブロック [1] に移動し、2 文字の長さはブロック [2] に移動します。

しかし、私の現在のコードが行うことは、要素を allL block[x] に追加して、ブロック[1] ブロック[2] ブロック[3] ..... がすべて同じになるようにすることです。

4

2 に答える 2

7

この行は、同じ空のリストを 15 回blokk = [[]] * 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]またはに追加すると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 に答える