2017-10-18 13 views
1

文をループし、{x:y}をマップする辞書を作成するという非常に簡単な例をとります。ここで、xは単語の長さを表す鍵であり、yはリストです手紙のx量が含まれている文章中の単語のPythonで辞書の理解の値のリストを作成する方法

入力:

mywords = "May your coffee be strong and your Monday be short" 

予想される出力:

{2: ['be', 'be'], 3: ['May', 'and'], 4: ['your', 'your'], 5: ['short'], 6: ['coffee', 'strong', 'Monday']} 

は、ここでの値のリストを作成しますが、それを毎回上書き試みです:

{len(x):[x] for x in mywords.split()} 
{2: ['be'], 3: ['and'], 4: ['your'], 5: ['short'], 6: ['Monday']} 

はPythonで1行でこれを行うには、それは可能ですか?

答えて

2

もちろん、sorted + groupbyを使用しても問題ありません。

from itertools import groupby 
d = dict([(k, list(g)) for k, g in groupby(sorted(mywords.split(), key=len), key=len)]) 

print(d) 
{2: ['be', 'be'], 
3: ['May', 'and'], 
4: ['your', 'your'], 
5: ['short'], 
6: ['coffee', 'strong', 'Monday']} 

P.S.は、ここに私はansweroriginal questionに(私はこの上をお勧めしますdefaultdictを使用して)です。

2

すべてを1行に詰め込もうとしないでください。読み取り不可能です。これは、それが行のカップルを取る場合でも、簡単な、わかりやすいソリューションです:

from collections import defaultdict 

mywords = "May your coffee be strong and your Monday be short"  
ans = defaultdict(list) 

for word in mywords.split(): 
    ans[len(word)].append(word) 
+0

私は、これはこれを行うには「正しい方法」であることに同意...しかし、それはかなり明らかに彼の1に違反します –

+0

@JoranBeasley参考までに、この質問は[別の質問](https://stackoverflow.com/q/46820551/4909087)、私の[回答](https://stackoverflow.com/)に由来しています。 a/46820587/4909087)がこれに当てはまります。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ私は彼が最初にそれを投稿したとき、彼はあなたの答えがあるメタであると思った。私は理解でそれを行うために探している、私は他の答えでこの解決策を見ていたが、私は1行でそれを試していた - 1ライナーが予想よりも少し混乱していることが判明 – AK47

関連する問題