2017-11-08 10 views
0

私はこのHackerrankの質問に就いています。私は実践のためにやっています。私の人生はタプルをタプルの中でどのように並べ替えるべきか分からないようです。辞書内のタプルをタプル内でソートしますか?

例えば、これは、入力

2015-08, 2016-04 

2015-08-15, clicks, 635 
2016-03-24, app_installs, 683 
2015-04-05, favorites, 763 
2016-01-22, favorites, 788 
2015-12-26, clicks, 525 
2016-06-03, retweets, 101 
2015-12-02, app_installs, 982 
2016-09-17, app_installs, 770 
2015-11-07, impressions, 245 
2016-10-16, impressions, 567 

であり、私が取得することになってるの出力は...

2016-03, app_installs, 683 
2016-01, favorites, 788 
2015-12, app_installs, 982, clicks, 525 
2015-11, impressions, 245 
2015-08, clicks, 635 

しかし、私が代わりに取得していますことは

です
2016-03, app_installs, 683 
2016-01, favorites, 788 
2015-12, ('clicks', '525'), app_installs, 982 
2015-11, impressions, 245 
2015-08, clicks, 635 

私の問題は、2015-12という行にあります。複数のタプルがあるときに、アルファベット順に並べるのは苦労しています。

これは私が間違ってやっている任意のアイデア私のコード

# Enter your code here. Read input from STDIN. Print output to STDOUT 
from datetime import date 

line = input() 

startDate = line.split(',')[0] 
startYear, startMonth = startDate.split('-') 
startDate = date(int(startYear), int(startMonth), 1) 

endDate = line.split(' ')[1] 
endYear, endMonth = endDate.split('-') 
endDate = date(int(endYear), int(endMonth), 1) 

line = input() 

d = {} 
while True: 
    try: 
     line = input() 
     currentDate = date(int(line.split('-')[0]), int(line.split('-')[1].split('-')[0]), 1) 

     if startDate <= currentDate < endDate: 
      engagement = line.split(',')[1].strip() 
      totalEngage = line.split(',')[2].strip() 
      correctDate = "{}-{}".format(currentDate.year, str(currentDate.month).zfill(2)) 
      if not correctDate in d: 
       d[correctDate] = engagement, totalEngage 
      else: 
       d[correctDate] = d[correctDate], engagement, totalEngage 
    except: 
     break 

for key in reversed(sorted(d)): 
    fin = "{}, {}".format(key, ', '.join(map(str, d[key]))) 
    print(fin) 

のですか?

ありがとうございます!

答えて

2

1レベルのネストされた1組のタプルを並べ替える問題に対処する前に、Hackerrankの問題自体を解決する簡単な方法を紹介します。
解決策の問題はこのコードセグメントです。

if not correctDate in d: 
    d[correctDate] = engagement, totalEngage 
else: 
    d[correctDate] = d[correctDate], engagement, totalEngage 

あなたが同じ月に分析のN種類を取得する場合、あなたが書いたコードのこのブロックはNレベル深い入れ子になったタプルを生成することに注意してください。ここにデモがあります。

>>> d = {} 
>>> d["2015-12"] = "clicks", 525 
>>> d["2015-12"] = d["2015-12"], "app_installs", 982 
>>> d 
{'2015-12': (('clicks', 525), 'app_installs', 982)} 
>>> d["2015-12"] = d["2015-12"], "downloads", 100 
>>> d 
{'2015-12': ((('clicks', 525), 'app_installs', 982), 'downloads', 100)} 

リストを使用して、同じ月のすべてのタイプの分析を保存することができます。タプルの最初の要素をキーとしてそのリストをソートする方がはるかに簡単です。

d = collections.defaultdict(list) 

がthis-

d[correctDate].append((engagement, totalEngage)) 

に問題のあるコード・セグメントを交換し、あなたの辞書を初期化最後に、あなたは逆年代順、日付順にソートし、アルファベット順に個々の日付内でソートされた出力を表示することができます。

for key in reversed(sorted(d)): 

    print("{}, {}".format(key, ', '.join([str(elem) for elem in sorted(a, key=lambda x: x[0])]))) 

ここで、1つのレベルのネストされた1組のタプルをソートする問題が発生しました。あなたは何とかを平らにして、入れ子になったタプルを並べ替える必要があります。または、タプル内のすべての要素を同じレベルにできます。
それを行うには非常に不器用な方法が

nested_tuple = (("bar", 1), "foo", 3) 
result = [] 
for elem, i in enumerate(nested_tuple): 
    if elem is tuple: 
     result.append(elem) 
    else: 
     result.append((elem, nested_tuple[i+1])) 
answer = sorted(result, key=lambda x: x[0]) 

をBE-う再び、ネストされたタプルを使用してこの問題を解決するために、不必要に複雑なアプローチであることに注意してください。しかし、あなたがそれを使用することを主張するならば、再帰を使用して、任意のレベルの深いネストされたタプルをソートすることができます。

+0

聖なる地獄。あなたの最初の方法はとても理にかなっています。ありがとうございました! – SortStuff

+0

@SortStuffソリューションを正常に提出したら、常にトップスコアラーが提出したソリューションをチェックすることをお勧めします。それで、あなたはこれらのようなすてきな技を学びます。 – princessRapunzel

関連する問題