0

問題なく完全に機能する次のコードを実装しました。でも見た目がかわいくないから満足できない?何よりも、Pythonicの方法のようには見えないように感じます。

そこで、stackoverflow コミュニティから提案を受けようと思いました。このメソッドは、メソッドが辞書を返す別のメソッドにあるSQLクエリからデータを取得し、その辞書のデータに基づいてパターンマッチとカウントプロセスを行っています。これをpythonicな方法で行い、より良いデータ構造を返したいと思います。

コードは次のとおりです。

def getLaguageUserCount(self):
    bots = self.getBotUsers()
    user_template_dic = self.getEnglishTemplateUsers()
    print user_template_dic
    user_by_language = {}
    en1Users = []
    en2Users = []
    en3Users=[]
    en3Users=[]
    en4Users=[]
    en5Users=[]
    en_N_Users=[]
    en1 = 0
    en2 = 0
    en3 = 0
    en4 = 0
    en5 = 0
    enN = 0
    lang_regx = re.compile(r'User_en-([1-5n])', re.M|re.I)
    for userId, langCode in user_template_dic.iteritems():
        if userId not in bots:
            print 'printing key value'
            for item in langCode:
                item = item.replace('--','-')
                match_lang_obj = lang_regx.match(item)
                if match_lang_obj is not None:
                    if match_lang_obj.group(1) == '1':
                        en1 += 1
                        en1Users.append(userId)
                    if match_lang_obj.group(1) == '2':
                        en2 += 1
                        en2Users.append(userId)
                    if match_lang_obj.group(1) == '3':
                        en3 += 1
                        en3Users.append(userId)
                    if match_lang_obj.group(1) == '4':
                        en4 += 1
                        en4Users.append(userId)
                    if match_lang_obj.group(1) == '5':
                        en5 += 1
                        en5Users.append(userId)
                    if match_lang_obj.group(1) == 'N':
                        enN += 1
                        en_N_Users.append(userId)
                else:
                    print "Group didn't match our regex: " + item
        else:
            print userId + ' is a bot'
    language_count = {}
    user_by_language['en-1-users'] = en1Users
    user_by_language['en-2-users'] = en2Users
    user_by_language['en-3-users'] = en3Users
    user_by_language['en-4-users'] = en4Users
    user_by_language['en-5-users'] = en5Users
    user_by_language['en-N-users'] = en_N_Users
    user_by_language['en-1'] = en1
    user_by_language['en-2'] = en2
    user_by_language['en-3'] = en3
    user_by_language['en-4'] = en4
    user_by_language['en-5'] = en5
    user_by_language['en-n'] = enN
    return user_by_language
4

1 に答える 1

3

これらすべてのリストを回避して、データをuser_by_language辞書に直接追加できます。

私はそれを次のように定義します:

user_by_language = collections.defaultdict(list)

正規表現を照合した後、次のようにします。

user_by_language['en-%s-users' % match_lang_obj.group(1)].append(userId)

最後に、これらの要素のすべての長さを取得してen-1en-2...として保存します。

于 2012-10-12T03:26:09.720 に答える