-1

私はリストの辞書を持っています:

d = {'a': ['Adam', 'Book', 4], 'b': ['Bill', 'TV', 6, 'Jill', 'Sports', 1, 'Bill', 'Computer', 5], 'c': ['Bill', 'Sports', 3], 'd': ['Quin', 'Computer', 3, 'Adam', 'TV', 3], 'e': ['Quin', 'TV', 2, 'Quin', 'Book', 5], 'f': ['Adam', 'Computer', 7]}

各リストは、その人が特定のオブジェクトを使用した回数を表します。たとえば、リスト'a'の場合、週に1回のAdam読み取りを示します。Book 4'b'では、週に1回Bill視聴し、' 'は週に1回再生します。TV 6Jillsports

各リスト内で、人が何かをした合計回数を見つけたいと思います。

この場合の出力は、次のようになります。

a: Adam 4
b: Bill 11, Jill 1
c: Bill 3
d: Quin 3, Adam 3
e: Quin 7
f: Adam 7

正確な形式である必要はありませんが、そのようなものです。

現在、Counterを使用してみましたが、それに関連付けられている番号ではなく、人々の名前のみがカウントされます。名前と番号を返すだけで試しましたが、名前が6つ以上あるリストもあるため、名前が1つ以上あるリストでは機能しません。

どんな助けでも大歓迎です!ありがとうございました!

4

3 に答える 3

3

データ構造でこれを本当に実行したい場合は、次のようにすることができます。

from collections import defaultdict

for k, lst in d.iteritems():
    counts = defaultdict(int)
    for i in range(0, len(lst), 3):
        counts[lst[i]] += lst[i + 2]
    print k, ", ".join(["%s %d" % (n, c) for n, c in counts.items()])

ただし、より適切なデータ構造にデータを格納することをお勧めします。「各リストは3つのグループに分かれており、各3つの最初の名前は名前などです」などのルールを使用して情報をリストに保存すると、データの操作が不器用で直感に反します。代わりに、データを次のように保存した場合はどうなりますか。

d = {'a': {'Adam': {'Book': 4}},
     'b': {'Bill': {'TV': 6, 'Computer': 5}, 'Jill': {'Sports': 1}},
     'c': {'Bill': {'Sports': 3}},
     'd': {'Quin': {'Computer': 3}, 'Adam': {'TV': 3}},
     'e': {'Quin': {'TV': 2, 'Book': 5}},
     'f': {'Adam': {'Computer': 7}}}

次に、次のような質問に答えることができます。

for k, v in d.items():
    print k, ", ".join(["%s %d" % (n, sum(a.values())) for n, a in v.items()])

これには他にも多くの利点があります。アダムが「a」で本を読んだ回数は、実行するだけでわかりますd["a"]["Adam"]["Book"](または、「アダム」または「本」がそこにあるかどうかわからない場合d["a"].get("Adam", {}).get("Book", 0))。このリストに基づく他の計算も可能であり、有用です。

于 2012-08-21T16:12:02.320 に答える
2

defaultdictここでは、リストのスライスが役立つと思います...

a = ['Adam', 'TV', 4, 'Adam', 'Bike', 4 ]
print a[::3] # ['Adam', 'Adam' ]
print a[2::3] # [4, 4]

from collections import defaultdict
for key,value in d.items():
    c = defaultdict(int)
    for k,v in zip(value[::3],value[2::3]):
        c[k] += v
    print key, c

Aも機能しますが、python2.7Counterまで導入されませんが、defaultdictpython2.5と互換性があり、この場合は同じ機能を提供します。

他の人が述べているように、これはあなたが使用している非常に奇妙なデータ構造のようです...

于 2012-08-21T16:10:41.290 に答える
0

これにより、目的の結果が得られます。

import collections
for k, v in sorted(d.iteritems()):
        tmp=collections.defaultdict(int)
        for i in xrange(0, len(v), 3):
                tmp[v[i]]+=v[i+2]
        print "{}: {}".format(k,
                ", ".join("%s %s" % (a, b)
                        for a, b in sorted(tmp.iteritems())))

出力:

a: Adam 4
b: Bill 11, Jill 1
c: Bill 3
d: Adam 3, Quin 3
e: Quin 7
f: Adam 7
于 2012-08-21T16:13:04.150 に答える