Programmers-メニュー更新


質問リンク

私の答え

from itertools import combinations

def convertObj(order, courseItem, solObj):
    
    if len(order) < courseItem:
        return
    
    tmp = list(combinations(order, courseItem))
    for value in tmp:
        value = tuple(sorted(value))
        key = ""
        for k in range(courseItem):
            key += value[k]
        if key in solObj:
            solObj[key] += 1
        else:
            solObj[key] = 0
            
def solution(orders, course):
    result = []
    
    
    for i in range(len(orders)):
        orders[i] = list(orders[i])
    for courseItem in course:
        solObj = {}
        
        for order in orders:
            convertObj(order, courseItem, solObj)
        all_keys = solObj.keys()
        all_values = solObj.values()
        if len(all_keys) >= 2:
            mmax = max(all_values)
            if mmax > 0:
                for key, value in solObj.items():
                    if value == mmax:
                        result.append(key)
    result.sort()
            
    return result
  • 関数と変数名を決定するのに非常に時間がかかります.
  • tuple,dictionaryの基本apiに詳しくない
  • 別の解釈

    import collections
    import itertools
    
    def solution(orders, course):
        result = []
    
        for course_size in course:
            order_combinations = []
            for order in orders:
                order_combinations += itertools.combinations(sorted(order), course_size)
    
            most_ordered = collections.Counter(order_combinations).most_common()
            result += [ k for k, v in most_ordered if v > 1 and v == most_ordered[0][1] ]
    
        return [ ''.join(v) for v in sorted(result) ]
  • できるだけ関数を作成しないでください.
  • 変数名の命名に使用します.
  • tupleとdictionaryの基本apiは暗記したほうがいい.
  • その他のクリーンアップ


    Coctionsモジュール内のCounterクラス


    collections.カウンタカウントの使用

    from collections import Counter
    
    Counter('hello world') # Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

    most_common()


    データ個数でソートされた配列を返すmost common()メソッドが提供されます.
    Counter('hello world').most_common() 
    # [('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]
    この方法を用いたパラメータがKを超えると、その数だけが返されるため、最も多いK個のデータが得られる.
    Counter('hello world').most_common(1) # [('l', 3)]

    リスト式


    文のリスト式

  • List、Set、Dictionaryではfor文とif文を使用して、セット内の要素を整理します.
  • [item for item in iterable]|は基本フォーマットです.
  • words = ['나는', '파이썬을', '공부하고', '있습니다.', '파이썬은', '무척', '심플하고', '명료합니다.']
    [len(word) for word in words]
    # [2, 4, 4, 5, 4, 2, 4, 6]

    リスト式if文でフィルタ

  • for文だけでなく、リスト式の要素をフィルタできます.
  • [item for item in iterable if 조건(item)]|は基本フォーマットです.
  • [len(word) for word in words if len(word) > 3]
    # [4, 4, 5, 4, 4, 6]