2013-11-01 6 views
1

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

У меня есть данные примеры, такие как:

[[('Item 1', <__main__.J object at 0x1018fc690>), ('Item 2', <__main__.J object at 0x1018fc6d0>)]] 

и я пытаюсь уменьшить, что

[<__main__.J object at 0x1018fc690>, <__main__.J object at 0x1018fc6d0>] 

Может кто-то пожалуйста мне точку в правильном направлении. Я пробовал itertools и zip (*) безрезультатно.

import itertools 
import operator 

class J(object): 
    pass 

w = J() 
w.Type = 'Item 1' 
w.Page = 35 
w.Fragment = 'AA' 

q = J() 
q.Type = 'Item 2' 
q.Page = 78 
q.Fragment = 'BA' 

z = [[('Item 1', w),('Item 2', q)]] 
y = [b for b in z] 
print y 

result = ([ a for a,b in z ], [ b for a,b in z ]) 
print result 
print zip(*z) 
+0

Является ли ваш список входных данных всегда списком кортежей, или он произвольно вложен? Ответы до сих пор находятся на правильном пути, но это становится немного сложнее, если вложенность может быть сколь угодно глубокой. –

+0

Да, гнездо - это проблема, которая причиняет мне боль. Решение Christian работает для моего теста. – Baywatch

ответ

7

Это то, что вы ищете?

result = [c[1] for b in z for c in b] 
print result 
+1

Да, это работает. Спасибо! – Baywatch

3

Что-то вроде этого?

>>> lis = [[(1, 'a'), (2, 'b')]] 

zip:

>>> zip(*lis[0])[1] 
('a', 'b') 

Список Постижение:

>>> [y for _, y in lis[0]] 
['a', 'b'] 
+0

Благодарим вас за попытку, но это, похоже, не работает. используя образец, который я предоставил. print zip (* z) [1] дает [('Item 2', <__ main __. J object at 0x1018f36d0>)] – Baywatch

+0

OP имеет другой список внутри первого. : P –

+0

@Baywatch Ах! Я пропустил, что у вас есть вложенный список, попробуйте: 'zip (* lis [0]) [1] ' –

0

В качестве альтернативы @ ответ христианина (и нет ничего плохого в том, что ответ), вы также можете сделать это с помощью itertools выравниваться списка:

result = [c[1] for c in itertools.chain.from_iterable(z)] 

Я бы идти с какой бы строительство вам легче следовать. Оба предполагают только один уровень вложенности - обращение с произвольно глубокой вложенностью может быть выполнено с помощью рекурсивного обработчика.

+0

Рекурсивные обработчики звучат весело. Я должен проверить их. – Baywatch

+0

Если вы входите в этот дизайн, этот ответ выглядит как достойный старт: http://stackoverflow.com/questions/2158395/flatten-an-irregular-list-of-lists-in-python - за исключением того, что у вас будет немного изменить его, потому что ваши элементы нижнего уровня являются кортежами, которые являются итерабельными. –

+0

Это очень полезно. Спасибо. – Baywatch

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