Python 将同一字典中两个键的值串联起来

Python 将同一字典中两个键的值串联起来,python,dictionary,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函数连接这些值

我有一本字典,像:

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

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

您必须自己定义键的顺序(否则
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')]

您必须自己定义键的顺序(否则
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')]

一种合并“列”的通用方法,允许您指定要合并的列和要提前合并的列:

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')))
传入:

  • 映射列表
  • 构成输出的每一列(
    “日期”、“费率”、“代码”、“产品”
    ,在上述示例中)
  • 输出中由输入列的合并列表组成的任何列(
    code=('country code','area code')
    ,在示例中,因此输出中的
    code
    是通过合并
    国家代码
    区号
    形成的)
输出:

data = [('2012-03-09', '199', '1114', 'Mobile'),
        ('2012-01-12', '900', '211', 'Teddy'),
        ('2012-11-11', '899', '4419', 'Handbag')]
>>> 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')]
如果只需单独处理每一行,您也可以循环调用它的输出,而不是调用
merged\u pivot()
生成器上的
list()

columns = ('date', 'rate', 'code', 'product')
for row in merged_pivot(a, *columns, code=('country code', 'area code')):
    # do something with `row`
    print row

一种合并“列”的通用方法,允许您指定要合并的列和要提前合并的列:

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')))
传入:

  • 映射列表
  • 构成输出的每一列(
    “日期”、“费率”、“代码”、“产品”
    ,在上述示例中)
  • 输出中由输入列的合并列表组成的任何列(
    code=('country code','area code')
    ,在示例中,因此输出中的
    code
    是通过合并
    国家代码
    区号
    形成的)
输出:

data = [('2012-03-09', '199', '1114', 'Mobile'),
        ('2012-01-12', '900', '211', 'Teddy'),
        ('2012-11-11', '899', '4419', 'Handbag')]
>>> 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')]
如果只需单独处理每一行,您也可以循环调用它的输出,而不是调用
merged\u pivot()
生成器上的
list()

columns = ('date', 'rate', 'code', 'product')
for row in merged_pivot(a, *columns, code=('country code', 'area code')):
    # do something with `row`
    print row

您希望输出是什么?字典没有固定的顺序,因此您的
zip()
函数不会以可预测的顺序为您提供值以进行连接。@Martijn Pieters--我想您很快就能理解我真正想要的:)我想说的是,我不想使用zip函数,如果我不知道字典的长度怎么办?这就是为什么我想要一段代码,它可以自己搜索字典中的键名和键值,每当它找到“国家代码”和“区号”时,它就可以将它们合并。但是在这种情况下,合并意味着什么呢?将其存储在新的密钥中?删除旧密钥?我们需要更多的信息。@Martijn Pieters——我想要和我的问题中定义的一样的输出,但我想用通用的方式,不需要硬代码!希望得到您的帮助:)提前谢谢!在不知道您期望的排序的情况下,使用这种通用方法没有多大意义。
数据[0][0]
是什么意思?哪个键提供了该列?因此,至少需要指定一个顺序。如果您需要指定排序,那么您还可以指定哪些列可能需要合并?字典没有固定的顺序,因此您的
zip()
函数不会以可预测的顺序为您提供值以进行连接。@Martijn Pieters--我想您很快就能理解我真正想要的:)我想说的是,我不想使用zip函数,如果我不知道字典的长度怎么办?这就是为什么我想要一段代码,它可以自己搜索字典中的键名和键值,每当它找到“国家代码”和“区号”时,它就可以将它们合并。但是在这种情况下,合并意味着什么呢?将其存储在新的密钥中?删除旧密钥?我们需要更多的信息。@Martijn Pieters——我想要和我的问题中定义的一样的输出,但我想用通用的方式,不需要硬代码!希望得到您的帮助:)提前谢谢!在不知道您期望的排序的情况下,使用这种通用方法没有多大意义。
数据[0][0]
是什么意思?哪个键提供了该列?因此,至少需要指定一个顺序。如果需要指定顺序,还可以指定哪些列可能需要合并。