まず、dict化の前にpythonの文字コードの扱いについて学ばれたほうがよいように思います。
Pythonドキュメント UNICODE HOWTO
単純にdictをprintする場合、個々のkeyやvalueに対してprint文の暗黙の文字コード変換が機能しないため文字化けします。ループさせて個々のkey,valueをprintする場合はterminalの文字コードに変換しようとするため、ユニコード文字列の場合(=u"hoge hoge")はきちんと表示されるはずです。
ちょっとやってみました。(入力がよくないため、あまり綺麗な実装とは言えませんが。。。)
lang
1# -*- coding: utf-8 -*-
2u'''文字列を辞書化する関数
3以下の書式のみに対応
4"[PLACEHOLDER] [value] [PLACEHOLDER] [value]...."
5前提条件:各要素がスペースで区切られており、必ずPLACEHOLDERSのいずれかの要素とvalueがペアで渡されることを想定
6'''
7from collections import defaultdict
8
9PLACEHOLDERS = [u"売ります", u"買います", u"その他"]
10
11
12def to_dict(s, splitter):
13 d = defaultdict(list)
14 items = s.split(splitter)
15 key = ""
16 lastindex = 0
17 for index, item in enumerate(items):
18 if(item in PLACEHOLDERS):
19 if(key != ""):
20 d[key][len(d[key]) - 1] = " ".join(items[lastindex:index])
21 key = item
22 lastindex = index + 1
23 d[item].append(items[index + 1])
24 return d
25
26if(__name__ == '__main__'):
27 # test
28 temp = u"売ります カメラ(高級品) 売ります 10年間使った中古の冷蔵庫 買います 新品のMacBookAir 10万円以内で その他 hogehoge"
29 for key, item in to_dict(temp, u" ").items():
30 for value in item:
31 print key, value
32
追記
おそらくスクレイピングの結果なのかな、と思います。
なので、スクレイピングで取得するときに少し工夫をして以下のような形式で取得できるのであれば、もっと綺麗な方法で実装することができます。
lang
1# -*- coding: utf-8 -*-
2u'''文字列を辞書化する関数
3以下の書式のみに対応
4['PLACEHOLDER', 'value', 'PLACEHOLDER', 'value',....]"
5前提条件:必ずPLACEHOLDERSのいずれかの要素とvalueがペアで渡されることを想定
6'''
7from collections import defaultdict
8
9PLACEHOLDERS = [u"売ります", u"買います", u"その他"]
10
11
12def to_dict(valuelist):
13 d = defaultdict(list)
14 for key, value in zip(valuelist[0::2], valuelist[1::2]):
15 d[key].append(value)
16 return d
17
18if(__name__ == '__main__'):
19 # test
20 temp = [u"売ります", u"カメラ(高級品)", u"売ります", u"10年間使った中古の冷蔵庫", u"買います", u"新品のMacBookAir 10万円以内で", u"その他", u"hogehoge"]
21 for key, item in to_dict(temp).items():
22 for value in item:
23 print key, value
こんなものでどうでしょうか?
どのような入力があるのかもう少し細かな仕様を提示していただければ、他の回答者の方がもっとよい回答をくださるかもしれません。
参考になれば幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/12/28 16:11
2014/12/28 16:24
2014/12/28 16:40
2014/12/28 18:27
2014/12/29 05:03