bugfix> python > 投稿

私はこれまでのところリストを出力するだけの現在のコードからテーブルを印刷しようとしていますが、これを達成する方法がわかりません。

{'judy': 1, 'dean': 1, 'andrew': 2, 'sam': 4, 'fred': 2}

入力が3の場合、この形式でリストを出力したいと思います。

4 sam
2 andrew fred
1 dean judy

または、入力が2の場合は次のようになります(すべてのタイもアルファベット順にする必要があります)。

4 sam
2 andrew fred

これはこれまでのところ、リストのみを出力する私のコードです:

x = input("Enter a number: ")
with open('stream.txt','r') as f:
    tweetlist = [r.split()[0] for r in f if "DM" not in r and "RT" not 
    in r]
tweet_counter = {}
for tweet in tweetlist:
    if tweet in tweet_counter:
        tweet_counter[tweet] += 1
    else:
        tweet_counter[tweet] = 1
popular_users = sorted(tweet_counter, key = tweet_counter.get, reverse 
= True)
top = popular_users[:x]
top.sort()
print(tweet_counter)

事前に感謝、すべての助けは大歓迎です

回答 1 件
  • collections.Counter があります  物事を数えるオブジェクトなので、最初のループ:

    tweet_counter = {}
    for tweet in tweetlist:
        if tweet in tweet_counter:
            tweet_counter[tweet] += 1
        else:
            tweet_counter[tweet] = 1
    
    

    次のものに置き換えることができます。

    from collections import Counter
    tweet_counter = Counter(tweetlist)
    
    

    Counter.most_common()   (key, value) を返します  値の順序で、Pythonの強力なイテレータ代数( itertools )必要な結果を取得します。最初に itertools.groupby() を使用する  値をまとめてグループ化し、 itertools.islice()  必要な番号を取得するには、例えば:

    import itertools as it
    import operator as op
    def print_table(tc, n):
        name, value = op.itemgetter(0), op.itemgetter(1)
        for k, g in it.islice(it.groupby(tc.most_common(), value), n):
            print(k, ' '.join(sorted(map(name, g))))
    In []:
    print_table(tweet_counter, 2)
    Out[]:
    4 sam
    2 andrew fred
    In []:
    print_table(tweet_counter, 3)
    Out[]:
    4 sam
    2 andrew fred
    1 dean judy
    
    

あなたの答え