2012-04-12 4 views
2

У меня есть список, как это:Свести список в Python

[[(video1,4)], [(video2,5),(video3,8)], [(video1,5)], [(video5, 7), (video6,9)]...] 

каждый элемент в этом списке может содержать одну пару данных или кортеж, я хочу, чтобы изменить этот список в

[(video1,4),(video2,5),(video3,8),(video1,5),(video5,7),(video6,9)...] 

затем сделать это:

for item in list: 
    reqs = reqs + item[1] 
    b.append(item[0]) 
c = set(b) 

Я не знаю, как изменить структуру списка, или как сделать то же самое вычисление на основе Origina l список?

+0

вам нужен '...' в примерном списке ли? это был бы рабочий пример без него. – jamylak

+1

Что вы на самом деле хотите достичь в конце концов? Набор '' c' из videoX' переменных и сумма остальных цифр вы перечислили? – Shep

+0

@jamylak нет, ....означает, что есть еще много похожих данных, которые я не перечисляю им. – manxing

ответ

3

Чтобы распрямить один уровень, вы можете использовать itertools.chain.from_iterable():

flattened_list = itertools.chain.from_iterable(my_list) 
+0

@Marcin: You правы, вот как это было вызвано в NumPy. :) –

+1

Доказательство, как если бы были необходимы доказательства, эти цифры плохи для вас;) – Marcin

1

Попробуйте это:

from itertools import chain 

c = set() 
reqs = 0 
for vid, number in chain(*your_list): 
    c.add(vid) 
    reqs += number 

Также см. соответствующую статью Flattening a shallow list in Python.

Должно быть незначительное увеличение производительности с chain.from_iterable(list), а не chain(*list), но это правда, что бывший выглядит чище.

-1

извлечь все кортежи из структуры данных ...

def get_tups(y): 
    z = [] 
    if y: 
     for x in y: 
      if isinstance(x, tuple): 
       z.append(x) 
      else: 
       z.extend(get_tups(x)) 
    return z 

может быть ...

+0

Что произойдет, если я назову 'get_tups ([('foo',)])'? – Marcin

+0

Поскольку вход содержит 1 кортеж, вы получите список, содержащий 1 кортеж. другими словами, выход будет таким же, как и вход;) –

+0

И что произойдет, если я его повторю во второй раз? Вот подсказка: http://ideone.com/zgMzq – Marcin

2

Вот еще один (нет библиотек):

def plus(a,b): return a + b 
reduce(plus, your_list) 
+0

Почему вы создаете именованную функцию вместо лямбда? – Marcin

+0

только для ясности, нет особых причин. – rodion

5

Существует очень простой способ сделать это со списком. Этот пример был задокументирован в питона документации here

>>> # flatten a list using a listcomp with two 'for' 
>>> vec = [[1,2,3], [4,5,6], [7,8,9]] 
>>> [num for elem in vec for num in elem] 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 

Вот решение, которое вы хотели бы реализовать. По вашему примеру, это самое простое решение

In [59]: your_list = [[('video1',4)], [('video2',5),('video3',8)], [('video1',5)], [('video5', 7), ('video6',9)]] 

In [60]: improved_list = [num for elem in your_list for num in elem] 

In [61]: improved_list 
Out[61]: 
[('video1', 4), 
('video2', 5), 
('video3', 8), 
('video1', 5), 
('video5', 7), 
('video6', 9)] 
+0

+1 Это самый красивый и лаконичный путь. – tgies

0

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

flat_list = sum(list_of_lists, []) 

Это работает из-за того, что сумма просто складывает списки, и добавление списков работает в питона, как и ожидалось :)

Примечание: Это неэффективно и некоторые говорят, что нечитаемы.

Смежные вопросы