2014-02-14 4 views
2

Давайте предположим, что есть список списков в Python:организовать список списков в Python

list_of_values = [[a, b, c], [d, e, f], [g, h, i], [j, k, l]] 

И я хочу, чтобы автоматически преобразовать в независимые списки как:

list1 = [[a, b, c],[d + g + j, e + h + k, f + i + l]] 
list2 = [[d, e, f], [g + j, h + k, i + l]] 
list3 = [[g, h, i], [j, k, l]] 

Скажем, у меня есть список списков целых чисел в Python:

list_of_values = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] 

И я хочу конвертировать автоматически в независимые списки как:

list1 = [[1, 2, 3],[4 + 7 + 10, 5 + 8 + 11, 6 + 9 + l2]] 
list2 = [[4, 5, 6], [7 + 10, 8 + 11, 9 + 12]] 
list3 = [[7, 8, 9], [10, 11, l2]] 

Выполнение математики:

list1 = [[1, 2, 3], [21, 24, 27]] 
list2 = [[4, 5, 6], [17, 19, 21]] 
list3 = [[7, 8, 9], [10, 11, l2]] 
+3

Что означает '+' здесь? – PascalVKooten

+1

Я с PascalvKooten, добавляем ли мы значения вместе или просто добавляем переменные в разные позиции списка? –

+2

Вы только что отредактировали свой вопрос в течение льготного периода? Я мог бы поклясться, что там не было никаких «+» вещей, когда я написал свой ответ ... – ThiefMaster

ответ

3

Для обновленному Вопрос:

Предположим, у вас есть "список списков строк", как показано ниже:

s = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k', 'l']] 

Затем вы можете использовать: Присоединиться к объединению:

>>> for i in range(len(s)): 
... [s[i], map(lambda t: ''.join(t), zip(*s[i + 1:]))] 
... 
[['a', 'b', 'c'], ['dgj', 'ehk', 'fil']] 
[['d', 'e', 'f'], ['gj', 'hk', 'il']] 
[['g', 'h', 'i'], ['j', 'k', 'l']] 
[['j', 'k', 'l'], []] 

Если вам не нужна последняя строка вывода, то просто использовать аргумент диапазона менее одной длины:

>>> for i in range(len(s)-1): 
... [s[i], map(''.join, zip(*s[i + 1:]))] # remove lambda function 
... 
[['a', 'b', 'c'], ['dgj', 'ehk', 'fil']] 
[['d', 'e', 'f'], ['gj', 'hk', 'il']] 
[['g', 'h', 'i'], ['j', 'k', 'l']] 

Но предположим, что если у вас есть «список списков чисел», например:

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] 

Затем вы можете использовать функцию сумма:

>>> for i in range(len(l) - 1): 
... [l[i], map(sum, zip(*l[i + 1:]))] 
... 
[[1, 2, 3], [21, 24, 27]] 
[[4, 5, 6], [17, 19, 21]] 
[[7, 8, 9], [10, 11, 12]] 

Edit: ..

Если вы хотите сделать одиночную функцию для обеих строк и цифр, вы можете использовать команду add() из библиотеки operator.

Проверить add() функция:

>>> from operator import add 
>>> add(1, 2) 
3 
>>> add('1', '2') # this is like + works 
'12' 

Теперь, используя это сделать новый my_add(), что добавить все элементы в последовательности, проверьте следующие коды:

>>> def my_add(t): 
... return reduce(add, t) 
... 
>>> my_add(('a', 'b')) 
'ab' 

>>> my_add((2, 1)) 
3 

Теперь напишем функцию, используя my_add() функцию что сделает вашу работу:

def do_my_work(s): 
    for i in range(len(s)-1): 
     print [s[i], map(my_add, zip(*s[i + 1:]))]  

Теперь посмотрим, как это сработает для вас:

>>> s 
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k', 'l']] 
>>> do_my_work(s) 
[['a', 'b', 'c'], ['dgj', 'ehk', 'fil']] 
[['d', 'e', 'f'], ['gj', 'hk', 'il']] 
[['g', 'h', 'i'], ['j', 'k', 'l']] 
>>> l 
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] 
>>> do_my_work(l) # so same function for str and int both! 
[[1, 2, 3], [21, 24, 27]] 
[[4, 5, 6], [17, 19, 21]] 
[[7, 8, 9], [10, 11, 12]] 
+0

Дорогой @GrijeshChauhan, спасибо за ваш ответ, похоже, он выполняет точную работу, которую я ищу. Есть два понятия, которые мне нужно, чтобы научиться полностью понимать ваш ответ: карту и лямбду. Большое спасибо за быстрый ответ! – gcamargo

+0

@ user2457899 Подождите еще немного. Я добавляю еще несколько полезных вещей в ответ. Using 'add()' just wait –

+0

@ user2457899 Я удалил лямбда. вам необходимо изучить map(), filter(), reduce(). –

3
>>> import itertools 
>>> lst = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k', 'l']] 
>>> for i, item in enumerate(lst): 
     print [item, itertools.chain.from_iterable(lst[i+1:])] 

[['a', 'b', 'c'], ['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']] 
[['d', 'e', 'f'], ['g', 'h', 'i', 'j', 'k', 'l']] 
[['g', 'h', 'i'], ['j', 'k', 'l']] 
[['j', 'k', 'l'], []] 
+0

«цепочка» - правильный инструмент здесь. В этом случае, однако, я думаю, что 'chain.from_iterable' лучше, чем распаковка аргументов. –

+0

@devnull: Обычно я это делаю. Но интерес к итератору python - один из тех случаев, когда мне до сих пор нравится разбираться в хорошем способе делать такие вещи (хотя это было довольно легко). – ThiefMaster

+0

Это ** не ответ ** где 'd + g + j' ?? –

2
for i in range(len(list_of_values) - 1): 
    print [list_of_values[i]] + [map(list, zip(*list_of_values[i+1:]))] 

Выход

[['a', 'b', 'c'], [['d', 'g', 'j'], ['e', 'h', 'k'], ['f', 'i', 'l']]] 
[['d', 'e', 'f'], [['g', 'j'], ['h', 'k'], ['i', 'l']]] 
[['g', 'h', 'i'], [['j'], ['k'], ['l']]] 

Для чисел, вы можете просто сделать

list_of_values = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] 
for i in range(len(list_of_values) - 1): 
    print [list_of_values[i]] + [map(sum, zip(*list_of_values[i+1:]))] 

Выход

[[1, 2, 3], [21, 24, 27]] 
[[4, 5, 6], [17, 19, 21]] 
[[7, 8, 9], [10, 11, 12]] 
Смежные вопросы