0

以下のようなpythonリストがあります:

DEMO_LIST = [
    [{'unweighted_criket_data': [-46.14554728131345, 2.997789122813151, -23.66171024766996]},
     {'weighted_criket_index_input': [-6.275794430258629, 0.4076993207025885, -3.2179925936831144]},
     {'manual_weighted_cricket_data': [-11.536386820328362, 0.7494472807032877, -5.91542756191749]},
     {'average_weighted_cricket_data': [-8.906090625293496, 0.5785733007029381, -4.566710077800302]}],

    [{'unweighted_football_data': [-7.586729834820534, 3.9521665714843675, 5.702038461085529]},
     {'weighted_football_data': [-3.512655913521907, 1.8298531225972623, 2.6400438074826]},
     {'manual_weighted_football_data': [-1.8966824587051334, 0.9880416428710919, 1.4255096152713822]},
     {'average_weighted_football_data': [-2.70466918611352, 1.4089473827341772, 2.0327767113769912]}],

    [{'unweighted_rugby_data': [199.99999999999915, 53.91020408163265, -199.9999999999995]},
     {'weighted_rugby_data': [3.3999999999999857, 0.9164734693877551, -3.3999999999999915]},
     {'manual_rugby_data': [49.99999999999979, 13.477551020408162, -49.99999999999987]},
     {'average_weighted_rugby_data': [26.699999999999886, 7.197012244897959, -26.699999999999932]}],

    [{'unweighted_swimming_data': [2.1979283454982053, 14.079951031527246, -2.7585499298828777]},
     {'weighted_swimming_data': [0.8462024130168091, 5.42078114713799, -1.062041723004908]},
     {'manual_weighted_swimming_data': [0.5494820863745513, 3.5199877578818115, -0.6896374824707194]},
     {'average_weighted_swimming_data': [0.6978422496956802, 4.470384452509901, -0.8758396027378137]}]]

リスト項目を操作し、各データ型リストを取得するなどの基本的な数学演算を実行したい (例: 重み付けされていないデータの最初の要素をすべて取得して合計するなど)

現在、私はこのようにやっています。

現在のソリューションは非常に基本的なものです。リストの長さが大きくなった場合に、結果を自動的に計算できるようにしたいと考えています。現在、4 つのリストがあり、5 または 8 の場合があります。最終結果は、重み付けされていない値の最初の要素すべての合計になります。例:

now I am doing result_u1/4,result_u2/4,result_u3/4
I want it like result_u0/4,result_u1/4.......result_n4/4 # n is the number of list inside demo list

どうすればそれを行うことができますか?

(初歩的な質問ですみません)

4

3 に答える 3

0

Python では、イテラブル (文字列、リスト、セット、これらのいずれかのコレクション) 内に何かがいくつあるかを数え始めて、それをループ処理するときはいつでも、コードを修正できるというサインです。

コードを変更せずに、何かの 3 つで機能することも、300、3000、300 万の同じもので機能することもあります。

あなたの場合、あなたの論理は - 「すべてXの内部についてDEMO_LIST、何かをする」です

これを Python に翻訳すると、次のようになります。

for i in DEMO_LIST:
   # do something with i

このスニペットは任意のサイズで実行されDEMO_LIST、各回iは side にあるもののそれぞれですDEMO_LIST。あなたの場合、辞書を含むリストです。

それをさらに拡張すると、次のように言えます。

   for i in DEMO_LIST:
      for k in i:
         # now you are in each list that is inside the outer DEMO_LIST

これを拡張して実用的な例を実行します。すべての合計unweighted_criket_data:

   all_unweighted_cricket_data = []
   for i in DEMO_LIST:
       for k in i:
         if 'unweighted_criket_data' in k:
             for data in k['unweighted_cricket_data']:
                  all_unweighted_cricked_data.append(data)

   sum_of_data = sum(all_unweighted_cricket_data)

同じことを行うためのさまざまな「ショートカット」がありますが、ショートカットが何をしようとしているかの「拡張」バージョンを理解すれば、それらを理解できます。

何かを行う最善の方法がわからない場合は特に、「長い道のり」を書き出すことに何の問題もないことを覚えておいてください。ロジックに慣れたら、リスト内包表記などのショートカットを使用できます。

于 2012-08-22T10:26:35.607 に答える
0

追加機能で新しいアイテムの値を使用してサマリーを追加するか、削除時に値を減らす特定のリスト クラスを自分用に実装できます。

class MyList(list):
    def __init__(self):
        self.summary = 0
        list.__init__(self)

    def append(self, item):
        self.summary += item.sample_value
        list.append(self, item)

    def remove(self, item):
        self.summary -= item.sample_value
        list.remove(self, item)

そして簡単な使い方:

my_list = MyList()
print my_list.summary  # Outputs 0
my_list.append({'sample_value': 10})
print my_list.summary # Outputs 10
于 2012-08-22T10:17:52.053 に答える
0

これを置き換えることから始めます:

for i in range(0,len(data_list)-1):
    result_u1+=data_list[i][0].values()[0][0]
    result_u2+=data_list[i][0].values()[0][1]
    result_u3+=data_list[i][0].values()[0][2]
print "UNWEIGHTED",result_u1/4,result_u2/4,result_u3/4

これとともに:

sz = len(data_list[i][0].values()[0])
result_u = [0] * sz
for i in range(0,len(data_list)-1):
    for j in range(0,sz):
        result_u[j] += data_list[i][0].values()[0][j]
print "UNWEIGHTED", [x/len(data_list) for x in result_u]

同様の変更を他の場所に適用します。これは、データが実際に「長方形」であること、つまり、対応するすべての内部リストに同じ数の値があることを前提としています。

もう少し "Pythonic"[*] バージョンの:

for j in range(0,sz):
    result_u[j] += data_list[i][0].values()[0][j]

は:

for j, dataval in enumerate(data_list[i][0].values()[0]):
    result_u[j] += dataval

ただし、コードにはいくつかの問題があります。

  • values()[0]辞書は順序付けされていないため、辞書内の値のいずれかが得られる可能性があります。たまたま重み付けされていないデータが得られるかもしれませんが、そうでないかもしれません。
  • 0 から までの範囲でループしている理由がわかりません。必要なlen(data_list)-1すべてのスポーツを含めたい場合は、上限であるから の 2 番目のパラメーターが除外されているためです。0len(data_list)range

おそらく、次のようにデータを再フォーマットすることを検討できます。

DEMO_LIST = {
    'cricket' : {
        'unweighted' : [1,2,3],
        'weighted' : [4,5,6],
        'manual' : [7,8,9],
        'average' : [10,11,12],
    },
    'rugby' : ...
}

各スポーツの辞書で同じキーを取得したら、 に置き換えることができるためvalues()[0]['unweighted']常に正しい辞書エントリを取得できます。そして、すべて同じキーを持つ辞書がたくさんある場合は、それらをクラスまたは名前付きタプルに置き換えて、それらが常に存在する必要がある値であることを定義/強制することができます。

import collections
Sport = collections.namedtuple('Sport', 'unweighted weighted manual average')
DEMO_LIST = {
    'cricket' : Sport(
        unweighted = [1,2,3],
        weighted = [4,5,6],
        manual = [7,8,9],
        average = [10,11,12],
    ),
    'rugby' : ...
}

と交換できるように['unweighted']なりました.unweighted

[*] 「Pythonic」という言葉は、公式には「Python プログラマーのスタイルで行われ、便利な Python 機能を利用して、最高の慣用的な Python コードを生成する」ようなものを意味します。実際には、これは通常、「私はこれが好きで、私は Python プログラマーなので、これが Python を書く正しい方法です」という意味です。あなたがグイド・ヴァン・ロッサムなら権威による議論であり、そうでなければ漠然とした権威への訴えだ。ほとんどすべての状況で、文の意味を変えることなく「良いIMO」に置き換えることができます;-)

于 2012-08-22T10:20:29.910 に答える