2

Pythonでは、現在、印刷すると次のような辞書(リスト内のリストからの複合キーがあります)があります。

最初の値は数値であり、2番目の値(AまたはB)はテキスト値を示し、数値は、このディクショナリが派生したリストの元のリストに表示された回数のカウントです。

必要なのは、次の形式でデータを印刷する方法です。ディクショナリ内の数値(つまり、この場合は1番目と3番目の値)の一意の出現については、関連するテキスト値とそのカウントを出力します。だからそれは次のようになります

タイプ:111テキストカウント

       A     4
       B    10

      Total: 14

タイプ:112テキストカウント

       A      3

     Total:   3

Ifステートメントと組み合わせる場合は、ある種のwhileループを使用する必要があることを知っています。私がこれまでに研究したこと(Pythonについてこれまでに教えてきたことに関連する)から、印刷したいものだけを印刷するifステートメントを使用してループを作成する必要があります。したがって、新しい数値が最初に発生したときに印刷する必要がありますが、2番目(または3番目または4番目など)に発生したときは印刷しません。私はこれを部分的に行うことを想定しており、それらを変数に入れてから、現在の値と比較します。同じ場合は印刷しませんが、異なる場合は古い数値の「合計」を印刷し、全体の合計に加算してから新しい数値を印刷します。

4

5 に答える 5

5

1つのフラットな辞書の代わりに、dict内のdict、dict内のタプルなどのオブジェクトの階層を使用します。

dict内にdictがある例を考えてみましょう。

data = { 
    '111': {
        'A': 4,
        'B': 10,
    },
    '112': {
        'A': 3
    },
}

これで、コンテンツに簡単にアクセスできるようになりました。たとえば、「111」内のプロパティを表示します。

for key in data['111']:
    print "%s\t%s" % (key, data['111'][key])

2つのforループを組み合わせることで、目的の出力を簡単に作成できます。

for datatype in data:
    print("Type: %s Text Count" % datatype)
    items = data[datatype]
    total = 0
    for key in items:
        print "%s\t%s" % (key, items[key])
        total += items[key]
    print("Total:\t%s\n" % total)

指定されたデータで上記を実行すると、次の出力になります。

Type: 111 Text Count
A       4
B       10
Total:  14

Type: 112 Text Count
A       3
Total:  3
于 2012-10-16T13:28:47.267 に答える
3

より良いデータ構造は次のように思われます。

{111:[('A', 4),('B',10)], 112:[('A': 3)]}

次に、dictを簡単に印刷できます。

for k,v in d.items():
   print "Type: {0}\t Text Count".format(k)
   for item in v:
       print "\t\t{0}  {1}".format(*v)

あなたの口述をこの形式に変換するために、私は:を使用しdefaultdictます

from collections import defaultdict
d = defaultdict(list)
for k,v in yourdict.items():
    new_key,value0 = (x.strip() for x in k.split(','))
    d[int(new_key)].append((value0,v))
于 2012-10-16T13:28:58.717 に答える
3
于 2012-10-16T13:30:49.187 に答える
2

You can use tuples as your keys. Instead of '111, A' try ('111', 'A')

It allows you to easily loop through the dictionary looking for matches to either the first or second key value. Just like what you have, except change the key:

for row in lists: 
    key = (row[0], row[1])
    if key in dictionary: 
        dictionary[key] += 1 
    else: 
        dictionary[key] = 1

#gives
dictionary = {('111', 'A'): 4, ('111', 'B'):10, ('112', 'A'):4}

Now, you're exactly right: you need a variable to store the total, you need to loop through the dictionary, and you need to use conditional statements inside the loop. What exactly are you asking about?

You can loop through the dictionary like this:

for k in d:
    print k, d[k]

If you keep your string keys, you will need to extract the two values from each key, which you can do with split. (No need to do this step if you use tuples):

#with string keys
key_1, key_2 = k.split(',')

You need to test if the first key value matches the desired number, and then you want to print the letter and the value d[k], and update the total variable:

if key_1 == desired:
    print key_2, d[k]
    total += d[k]

So you can put it together, inside a function like this:

def f(d, desired):
    total = 0
    for k in d:
        key_1, key_2 = k.split(',')
        if key_1 == desired:
            print key_2, d[k]
            total += d[k]
    print 'total', total

If you use tuples instead of keys, you can remove the split step, and just use k[0] and k[1] to get the two values:

def f(d, desired):
    total = 0
    for k in d:
        if k[1] == desired:
            print k[0], d[k]
            total += d[k]

    print 'total', total
于 2012-10-16T13:40:42.693 に答える
0

I wrote a straightforward function that prints what you want. It needs the dictionary as the first argument and the type as a int as second (e.g. fancy_print({'111, A': 4, '112, A': 3,'111, B': 10}, 111)):

def fancy_print(d, typ):
    res=[]
    for k in d:
        kp=[q.strip() for q in k.split(',')]
        if int(kp[0])==typ:
            res.append((kp[1],d[k]))
    res.sort()
    print('\tType: %d Text Count' % typ)
    for t,n in res:
        print('\t%s\t%2d' % (t, n))
    print()
    print('\tTotal:\t%2d' % sum([n[1] for n in res]))
于 2012-10-16T13:40:15.377 に答える