0

私はList次のように構成された(生のテキストから抽出された)統計を持っています:

list_stats = [u'site1.com', u'3,346', u'23', u'0.68%', u'\u20ac0.04', u'\u20ac0.25', u'\u20ac0.85', u'site2.com', u'45,784', u'243', u'0.56%', u'\u20ac0.34', u'\u20ac0.32', u'\u20ac0.43', u'site3.com', u'9,396', u'432', u'4.54%', u'\u20ac890.24', u'\u20ac9.87', u'\u20ac8.93']

私はこのようなものを持ちたいDict:

sites = {
    u'site1.com' : [u'3,346', u'23', u'0.68%', u'\u20ac0.04', u'\u20ac0.25'],
    u'site2.com' : [u'45,784', u'243', u'0.56%', u'\u20ac0.34', u'\u20ac0.32'],
    u'site3.com' : [u'9,396', u'432', u'4.54%', u'\u20ac890.24', u'\u20ac9.87', u'\u20ac8.93']
}

これまでのところ、私はこれをコーディングしましたが、動作しています:

sites = {}
for field in list_stats:
    if 'count' not in locals(): count = 0
    if count == 0:
            sites[field] = []
            current = field
    else:
            sites[current].append(field)
    count = count + 1
    if count == 7:
            count = 0

ただし、完璧ではないようです。もっとクリーンでエレガントなものを思いつくことができると確信しています. あなたはそれをより良く再コーディングできますか?

4

3 に答える 3

3

お使いのバージョンのPythonがdict内包表記をサポートしている場合(2.7以降)

{k: list_stats[i*7+1:(i+1)*7] for i, k in enumerate(list_stats[::7])}

この場合、これは

{u'site1.com': [u'3,346',
                u'23',
                u'0.68%',
                u'\u20ac0.04',
                u'\u20ac0.25',
                u'\u20ac0.85'],
 u'site2.com': [u'45,784',
                u'243',
                u'0.56%',
                u'\u20ac0.34',
                u'\u20ac0.32',
                u'\u20ac0.43'],
 u'site3.com': [u'9,396',
                u'432',
                u'4.54%',
                u'\u20ac890.24',
                u'\u20ac9.87',
                u'\u20ac8.93']}
于 2013-01-15T03:14:12.730 に答える
2

あなたが探していると思うenumerateモジュロ演算子、% .

sites = {}
for count, field in enumerate(list_stats):
    if count % 8 == 0:
            sites[field] = []
            current = field
    else:
            sites[current].append(field)
于 2013-01-15T03:06:10.647 に答える
1

辞書内包表記とitertools.grouperソリューションの使用

from itertools import izip_longest
>>> from pprint import PrettyPrinter
>>> pp = PrettyPrinter(indent = 4)
>>> pp.pprint({e[0]: e[1:] for e in izip_longest(*[iter(list_stats)]*7)})
{   u'site1.com': (   u'3,346',
                      u'23',
                      u'0.68%',
                      u'\u20ac0.04',
                      u'\u20ac0.25',
                      u'\u20ac0.85'),
    u'site2.com': (   u'45,784',
                      u'243',
                      u'0.56%',
                      u'\u20ac0.34',
                      u'\u20ac0.32',
                      u'\u20ac0.43'),
    u'site3.com': (   u'9,396',
                      u'432',
                      u'4.54%',
                      u'\u20ac890.24',
                      u'\u20ac9.87',
                      u'\u20ac8.93')}
于 2013-01-15T03:58:45.440 に答える