0

このコードは本 Learning python からのもので、コンマで区切られたテキスト ファイルの列を合計するために使用されます。7行目、8行目、9行目がよくわかりません。助けてくれてありがとう。コードは次のとおりです。

filename='data.txt'
sums={}
for line in open(filename):
    cols=line.split(',')
    nums=[int(col) for col in cols]
    for(ix, num) in enumerate(nums):
        sums[ix]=sums.get(ix, 0)+num
for key in sorted(sums):
    print(key, '=', sums[key])
4

2 に答える 2

2

入力ファイルには、カンマ区切りの整数の行が含まれているようです。このプログラムは、各列の合計を出力します。

プログラムの意味を変えるインデントをごちゃまぜにしてしまいました。ここに多くのコメントがあります:

filename='data.txt'    # name of the text file

sums = {}              # dictionary of { column: sum }
                       #   not initialized, because you don't know how many columns there are

# for each line in the input file,
for line in open(filename):
    # split the line by commas, resulting in a list of strings
    cols = line.split(',')
    # convert each string to an integer, resulting in a list of integers
    nums = [int(col) for col in cols]

    # Enumerating a list numbers the items - ie,
    #   enumerate([7,8,9]) -> [(0,7), (1,8), (2,9)]
    # It's used here to figure out which column each value gets added to
    for ix, num in enumerate(nums):
        # sums.get(index, defaultvalue) is the same as sums[index] IF sums already has a value for index
        # if not, sums[index] throws an error but .get returns defaultvalue
        # So this gets a running sum for the column if it exists, else 0;
        # then we add the new value and store it back to sums.
        sums[ix] = sums.get(ix, 0) + num

# Go through the sums in ascending order by column -
#   this is necessary because dictionaries have no inherent ordering
for key in sorted(sums):                    
    # and for each, print the column# and sum
    print(key, '=', sums[key])

少し違った書き方をします。何かのようなもの

from collections import Counter
sums = Counter()

with open('data.txt') as inf:
    for line in inf:
        values = [int(v) for v in line.split(',')]
        sums.update(enumerate(values))

for col,sum in sorted(sums.iteritems()):
    print("{}: {}".format(col, sum))
于 2013-01-31T02:47:34.880 に答える
1

1 行目から 6 行目を理解していると仮定すると…</p>

7 行目:

sums[ix]=sums.get(ix, 0)+num

sums.get(ix, 0)を返すsums[ix]場合を除いて、 と同じです。したがって、これは に似ていますが、これが を初めて見た場合に最初に値を に設定する点が異なります。ix not in sums0sums[ix] += num0ix

sums[ix]したがって、このループの終わりまでに、が column のすべての値の合計になることは明らかですix

これはばかげた方法です。mgilson が指摘しているdefaultdictように、追加のロジックは必要ありません。または、もっと簡単に言えば、 a のlist代わりに a を使用することもできますdict。なぜなら、これ (連続した小さな数字によるインデックス付け) がまさにlists の目的だからです…</p>

8 行目:

for key in sorted(sums):

まず、 anydictを alistまたは他の iterable であるかのように反復でき、 を反復するのと同じ効果がありますsums.keys()。したがって、 のようsumsに見える場合は{ 0: 4, 1: 6, 2: 3 }、 を反復処理し0, 1, 2ます。

ただし、dict固有の順序はありません。、または、またはその他の順序で0, 1, 2取得できます。1, 0, 2

したがって、ソートされた順序でキーsorted(sums)のコピーを返すだけで、その順序でlist取得できることが保証されます0, 1, 2

繰り返しますが、これはばかげています。なぜならlist、最初に a を使用しただけで、順序が整うからです。

9 行目:

print(key, '=', sums[key])

これは明らかなはずです。keyを繰り返す場合0, 1, 2、これは0 = 4, 1 = 6, を出力し2 = 3ます。

つまり、各列番号を、その列のすべての値の合計と共に出力します。

于 2013-01-31T03:03:04.757 に答える