1

リスト A に 200 個の数値のリストがあるとします。リスト A を 4 つのクラスターに分割するリスト B を作成したいので、50 個のクラスターが得られます。リスト BI では、4 つの値のクラスターごとにリストを作成するため、リスト B には 50 個のリストが含まれます。

ソースを使用して問題を説明します。

    from pprint import pprint

    FileValuelist = []

    def DetermineClusterNumber(File):               #determine digits in a cluster
            Lines = open(File, "r")
            i = 0 # used for iterating through the lines
            FirstLine = Lines.readline()
            for char in FirstLine:                  # read through first line, till hyphen.
                    if char != "-":
                            i += 1
                    elif char == "-":
                            return i # Return number of digits in the cluster 

    def ReadLines(File, Cluster_Number):
            Lines = open( File, "r" )
            for Line in Lines:
                    for char in Line:
                            if char != "-":
                                            FileValuelist.append(char)

    def RemoveNewlines(Rawlist):
            for x in range(len(FileValuelist)-9):
                    if FileValuelist[x] == "\n":
                            FileValuelist.remove(FileValuelist[x])
                    if FileValuelist[x] == "\r":
                            FileValuelist.remove(FileValuelist[x])


    Cluster_Number = DetermineClusterNumber("Serials.txt") # Amount of chars in a cluster. Example: 1234-2344-2345. clusternumber = 4
    ReadLines ("Serials.txt", Cluster_Number)
    RemoveNewlines(FileValuelist)

    list_iterater = 0

    FinishedList = ([[None]*(Cluster_Number)])*((len(FileValuelist)))
    amount_of_clusters = len(FileValuelist)/Cluster_Number

    for x in range(0, amount_of_clusters):
            for y in range(0, Cluster_Number):
                    FinishedList[x][y] = FileValuelist[list_iterater]
                    list_iterater += 1

    pprint(FinishedList)

serials.txt には以下が含まれます。

    4758-8345-1970-4486-2348
    2346-1233-3463-7856-4572
    6546-6874-1389-9842-4185
    9896-4688-4689-6455-4712
    9541-5621-8414-7465-5741
    4545-9959-5632-6845-1351
    5643-2435-5854-6754-8749
    7892-3457-8923-4572-5397
    5623-5698-5468-5476-9874
    8762-3487-6123-7861-2679

これを実行すると、50 に分割された 50 のリストを含むリストに serials.txt が出力されることが期待されます。ただし、実行すると [2,6,7,8] が 50 回出力されます。それが最後のクラスターです。したがって、問題は39行目のどこかにあると思います.41行目でFinishedListに割り当てられた値を調べようとしましたが、それは毎回正しい値でした(リストが印刷した)。私はすでに x と y のイテレータを再チェックしました (はい、それがイテレータのスペルであることは知っています)、それらも正しいです。

では、最後のクラスターを 50 回出力するコードのどこが間違っているのでしょうか? ちなみに、私は Python 2.7 を使用しています。

前もって感謝します!

4

5 に答える 5

1

この行は、あなたが思っていることをしていません:

FinishedList = ([[None]*(Cluster_Number)])*((len(FileValuelist)))

[None, None, None... None]同じリストへの参照を格納していますlen(FileValuelist)(*オペレーターは基本的に浅いコピーを実行します)。新しいリストを確実に作成したい場合、最も簡単な方法はリスト内包表記を使用することです。

FinishedList = [[None] * Cluster_Number for _ in xrange(len(FileValuelist))]
于 2012-12-17T17:12:21.823 に答える
0

おい、不快感はありませんが、あなたのコードはひどく非Python的です-コードスタイルとリストに関するいくつかのチュートリアルを探してください。この問題全体(私が正しく理解している場合)は、数行の簡単なコードで解決できます。

私が理解している限り、ファイル内の4桁の各値をその桁のリストに変換し、これらの桁を別のリストに格納します。これは入力を意味します。

"1234-5678-9999"

結果は次のようになります

[[1,2,3,4], [5,6,7,8], [9,9,9,9]]

これは、次のように簡単に実現できます。

with open("serials.txt") as f:
    clusters = [c for line in f for c in line.strip().split("-")]
    digits = [list(c) for c in clusters]

Digitsには、各クラスターの文字のリストが含まれるようになりました。整数としての値が必要な場合は、のlist(c)ようなネストされたリスト内包に変更できます[int(x) for x in c]

于 2012-12-17T18:14:18.963 に答える
0

どうしてそんなに複雑な方法でそれをするのですか?次の 2 行のコードで目的を達成できます。

>>> with open('serials.txt') as data: 
...    clusters = [[int(digit) for digit in cluster] for line in data for cluster in line.strip().split('-')]

次にclusters含まれます:

[
    [4, 7, 5, 8],
    [8, 3, 4, 5],
    [1, 9, 7, 0],
    # ...
]
于 2012-12-17T18:11:52.497 に答える
0

行の 2 番目の乗算は、FinishedList = ([[None]*(Cluster_Number)])*((len(FileValuelist)))実際にはlen(FileValuelist)新しいリストを作成するのではなく、元のリストへのポインターをそれだけ多く作成します。どちらかを変更すると、すべてが変更されます。しばらく前に同じ質問をしました。受け入れられた回答を参照してください。

于 2012-12-17T17:11:35.367 に答える
0

を初期化する方法FinishedListでは、同じサブリストへの参照でいっぱいのリストになります。次に、に移動して代入する[x][y]と、毎回何度も参照される同じ値が上書きされます。Python でリストを初期化する必要はないのでappend()、2 番目のループで使用してみてください。

for x in range(amount_of_clusters):
    offset = x * Cluster_Number
    FinishedList.append(FileValueList[offset:offset + Cluster_Number])
于 2012-12-17T17:12:08.437 に答える