2013-03-07 4 views
2

Как я могу объединить два элемента из разных списков, а также, если у меня есть список, как это:Как объединить два элемента из разных списков с помощью python?

data_list = [['Toys', 'Communications', 'Leather'], ['Teddy', 'Mobile', 'Hand'], ['bear', 'phone', 'bag']] 

Я использовал зип функцию, чтобы преобразовать их в кортежах, как это:

data_tupled_list = zip(*data_list) 

, что приводит как это:

[('Toys', 'Teddy', 'bear'), 
('Communications', 'Mobile', 'phone'), 
('Leather', 'Hand', 'bag')] 

Я хочу, чтобы список, как это:

[('Toys', 'Teddybear'), 
('Communications', 'Mobilephone'), 
('Leather', 'Handbag')] 

ответ

6

Вы большую часть пути туда:

data_tupled_list = [(x[0],x[1]+x[2]) for x in zip(*data_list)] 

Это может быть немного более милым, если вы распаковать кортеж:

data_tupled_list = [(a,b+c) for a,b,c in zip(*data_list)] 

И было бы определенно быть красивей, если вы могли бы дать a, b и c более значимые имена.

+0

Я бы пойти дальше и использовать «» .join ((Ь, с)), чтобы избежать неприятных производительностей конкатенации в списке – GoingTharn

+0

@GoingTharn - Там нет никаких оснований для использования '. '.join ((b, c))' over 'b + c'. Join необходимо создать кортеж, а затем объединить его в основном так же, как и 'b + c'. Если у вас более двух элементов, вы можете получить небольшой выигрыш. Конечно, для произвольной длины вы хотите «присоединиться». Но для случая, когда у вас есть только 2 элемента, я подозреваю, что '+' настолько же эффективен, как вы можете получить. – mgilson

+0

- это правда, даже если вы находитесь в неявном цикле с пониманием списка? Я всегда предполагал (возможно, ошибочно!), Что конкатенация внутри цикла/списка comp не работает – GoingTharn

1

Существует хороший способ, чтобы написать это в Python3

>>> data_list = [['Toys', 'Communications', 'Leather'], ['Teddy', 'Mobile', 'Hand'], ['bear', 'phone', 'bag']] 
>>> [(x, ''.join(args)) for x, *args in zip(*data_list)] 
[('Toys', 'Teddybear'), ('Communications', 'Mobilephone'), ('Leather', 'Handbag')] 
0

Я бы работать на нем в двух частях; Вы действительно хотите сделать следующее:

data_list = [['Toys', 'Communications', 'Leather'], ['Teddy', 'Mobile', 'Hand'], ['bear', 'phone', 'bag']] 
groups = data_list[0] 
predicates = data_list[1] 
suffixes = data_list[2] 

combined = [ ''.join((pred, suff)) for pred, suff in zip(predicates, suffixes)] 
finalresult = zip(groups, combined) 
Смежные вопросы