连接同一个字典中两个键的值

时间:2013-03-08 11:39:48

标签: python dictionary

我有一本字典:

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')]

如果我希望函数自己搜索“国家/地区代码”和“区号”并合并它们,该怎么办?有什么建议吗?

2 个答案:

答案 0 :(得分:3)

合并“列”的通用方法,可让您指定要预期的列和前面要合并的内容:

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 code和{{1}形成的}})。

输出:

area 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()

答案 1 :(得分: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')]
相关问题