Общий способ распаковки и объединения вложенных кортежей

1

Я создал декартово произведение трех 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'], … ]

Существует ли эффективный общий метод для этого?

Последующие действия (увидев ответ Дэн Д.):

Что делать, если мои кортежи выглядели как

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

и я хотел добавить float вместо того, чтобы конкатенировать значения?

Теги:

4 ответа

2
Лучший ответ

Вам не нужно записывать все на одной строке:

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

print list(combine(product( ... )))
  • 0
    Согласовано. Ответ Дэна более конкретен для конкретного случая, но он более гибкий и легко адаптируемый.
4
map(lambda v: map(' '.join, zip(*v)), combined)
  • 0
    Это именно то, что я искал.
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
  • 0
    Это поразительно и ужасно сложно (то есть, выражение yield в comb ()), все сразу.
0

Что делать, если мои кортежи выглядели как

mixed = (('text a', float a), ('текст b', float b), ('текст c', float c))

и я хотел добавить float вместо того, чтобы конкатенировать значения?

Попробуйте использовать встроенную функцию sum():

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню