首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接同一字典中两个键的值

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

Stack Overflow用户
提问于 2013-03-08 19:39:48
回答 2查看 204关注 0票数 1

我有一本字典,像这样:

代码语言:javascript
复制
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函数来连接这些值:

代码语言:javascript
复制
data = [(a,b,c+d,e) for a,b,c,d,e in zip(*a.values())]

输出:

代码语言:javascript
复制
data = [('2012-03-09', '199', '1114', 'Mobile'),
        ('2012-01-12', '900', '211', 'Teddy'),
        ('2012-11-11', '899', '4419', 'Handbag')]

如果我想让函数自己搜索“国家代码”和“区域代码”,然后将它们合并,该怎么办?有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-08 19:58:12

一个用于合并“列”的泛型方法,允许您指定预期的列和预先合并的列:

代码语言:javascript
复制
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)

您可以使用以下命令调用它:

代码语言:javascript
复制
list(merged_pivot(a, 'date', 'rate', 'code', 'product', code=('country code', 'area code')))

传入:

  • 组成输出的每个列的映射列表(在上面的示例中为'date', 'rate', 'code', 'product')
  • 由输入列的合并列表组成的输出中的任何列(在本例中为code=('country code', 'area code'),因此输出中的code是通过合并<代码>D11和area code).

形成的

输出:

代码语言:javascript
复制
>>> 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')]

或者,稍微重新格式化:

代码语言:javascript
复制
[('2012-03-09', '199', '1114', 'Mobile'), 
 ('2012-01-12', '900', '211', 'Teddy'),
 ('2012-11-11', '899', '4419', 'Handbag')]

如果只需要单独处理每一行,也可以循环遍历它的输出,而不是在merged_pivot()生成器上调用list()

代码语言:javascript
复制
columns = ('date', 'rate', 'code', 'product')
for row in merged_pivot(a, *columns, code=('country code', 'area code')):
    # do something with `row`
    print row
票数 3
EN

Stack Overflow用户

发布于 2013-03-08 19:42:10

您必须自己定义键的顺序(否则a.values会以任意顺序返回它)。我把你原来的字典重命名为dd

代码语言:javascript
复制
[(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')))]

返回

代码语言:javascript
复制
[('2012-03-09', '199', '1114', 'Mobile'),
 ('2012-01-12', '900', '211', 'Teddy'),
 ('2012-11-11', '899', '4419', 'Handbag')]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15293142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档