1

私は次のような辞書を持っていました:

a = {'date' : ['2012-03-09', '2012-01-12', '2012-11-11'],
     'rate' : ['199', '900', '899'],
     'country code' : ['1', '2', '44'],
     'area code' : ['114', '11', '19'],
     'product' : ['Mobile', 'Teddy', 'Handbag']}

次に、zip関数を使用して値を連結しました。

data = [(a,b,c+d,e) for a,b,c,d,e in zip(*a.values())]

出力:

data = [('2012-03-09', '199', '1114', 'Mobile'),
        ('2012-01-12', '900', '211', 'Teddy'),
        ('2012-11-11', '899', '4419', 'Handbag')]

関数自体で「国コード」と「市外局番」を検索し、それらをマージしたい場合はどうすればよいですか。何か提案はありますか?

4

2 に答える 2

3

'columns'をマージする一般的なメソッド。どの列を予期し、何を前もってマージするかを指定できます。

def merged_pivot(data, *output_names, **merged_columns):
    input_names = []
    column_map = {}
    for col in output_names:
        start = len(input_names)
        input_names.extend(merged_columns.get(col, [col]))
        column_map[col] = slice(start, len(input_names))
    for row in zip(*(data[c] for c in input_names)):
        yield tuple(''.join(row[column_map[c]]) for c in output_names)

あなたが呼ぶもの:

list(merged_pivot(a, 'date', 'rate', 'code', 'product', code=('country code', 'area code')))

渡す:

  • マッピングのリスト
  • 出力を構成する各列('date', 'rate', 'code', 'product'上記の例)
  • 入力列のマージされたリストで構成される出力内の任意の列(code=('country code', 'area code')この例でcodeは、出力ではとをマージして形成されますcountry codearea code

出力:

>>> list(merged_pivot(a, 'date', 'rate', 'code', 'product', code=('country code', 'area code')))
[('2012-03-09', '199', '1114', 'Mobile'), ('2012-01-12', '900', '211', 'Teddy'), ('2012-11-11', '899', '4419', 'Handbag')]

または、わずかに再フォーマット:

[('2012-03-09', '199', '1114', 'Mobile'), 
 ('2012-01-12', '900', '211', 'Teddy'),
 ('2012-11-11', '899', '4419', 'Handbag')]

ジェネレーターを呼び出す代わりに、list()各行merged_pivot()を個別に処理するだけでよい場合は、出力をループすることもできます。

columns = ('date', 'rate', 'code', 'product')
for row in merged_pivot(a, *columns, code=('country code', 'area code')):
    # do something with `row`
    print row
于 2013-03-08T11:58:12.197 に答える
2

キーの順序は自分で定義する必要があります(そうでない場合a.valuesは、任意の順序で返します)。元の辞書の名前をdd:に変更しました

[(a,b,c+d,e) for a,b,c,d,e in zip(*(dd[k] for k in ('date', 'rate', 'country code', 'area code', 'product')))]

戻り値

[('2012-03-09', '199', '1114', 'Mobile'),
 ('2012-01-12', '900', '211', 'Teddy'),
 ('2012-11-11', '899', '4419', 'Handbag')]
于 2013-03-08T11:42:10.210 に答える