解包和组合嵌套元组的一般方法

时间:2011-04-30 19:50:28

标签: python

我生成了三个dicts的笛卡尔积:

import itertools
combined = list(itertools.product(foo, bar, baz))

所以我的列表现在看起来像:

[(('text a', 'value a'), ('text b', 'value b'), ('text c', 'value c')), … ]

我想要做的是解压缩此列表,以便最终得到包含扁平嵌套元组的文本和值的列表列表:

[['text a text b text c', 'value a value b value c'], … ]

有没有一种有效的通用方法呢?

跟进(看过Dan D.的回答):

如果我的元组看起来像什么

(('text a', float a), ('text b', float b), ('text c', float c ))

我想添加浮点数而不是连接值?

4 个答案:

答案 0 :(得分:4)

map(lambda v: map(' '.join, zip(*v)), combined)

答案 1 :(得分:2)

您不必在一条线上塞满所有东西:

def combine(items):
    for tuples in items:
        text, numbers = zip(*tuples)
        yield ' '.join(text), sum(numbers)

print list(combine(product( ... )))

答案 2 :(得分:1)

这是一个概括:

def combine(functions, data):
    for elements in data:
        yield [f(e) for f, e in zip(functions, zip(*elements))]

# A simple function for demonstration.
def pipe_join(args):
    return '|'.join(args)

some_data = [
    (('A', 10), ('B', 20), ('C', 30)),
    (('D', 40), ('E', 50), ('F', 60)),
    (('G', 70), ('H', 80), ('I', 90)),
]

for c in combine( [pipe_join, sum], some_data ):
    print c

答案 3 :(得分:0)

  

如果我的元组看起来像什么

     

combined =(('text a',float a),('text b',float b),('text c',float c))

     

我想添加浮点数而不是连接值?

尝试使用内置的sum()函数:

sum(x for (_,x) in combined)