2015-09-23 2 views
3

У меня есть следующий набор данных, который представляет собой ряд строк хранится в виде вложенных списков:Извлечь столбец из списка строк с Python

[['John', '35', 'UK'], 
['Emma', '43', 'UK'], 
['Lucy', '25', 'AU']] 

(строки всегда такой же длины)

I необходимо вернуть 'UK', 'AU' в качестве итерабельного (безразлично к заказу).

Есть ли один вкладыш, который возвращает уникальные значения, содержащиеся в третьем столбце, и который проще этого?

set(list(map(list, zip(*l)))[2]) 

(Ref: Transpose list of lists)

ответ

5

Изменение вас собственный код:

Python 3.x:

set(list(zip(*l)[2])) 

Python 2.x:

set(zip(*l)[2]) 

Демо:

l=[['John', '35', 'UK'],['Emma', '43', 'UK'],['Lucy', '25', 'AU']] 
set(list(zip(*l)[2])) 
{'AU', 'UK'} 
+0

Правильно! Сначала я попробовал это, но вам нужно преобразовать вывод zip в любой список или кортеж, чтобы каждый мог быть индексируемым. В противном случае это исключает. – bsuire

+0

@bsuire, в какой версии python вы используете – The6thSense

+0

3. Я не думал, что это будет иметь значение здесь, но я думаю, что zip и map ведут себя несколько иначе, в зависимости от версии Python. – bsuire

3
>>> l = [['John', '35', 'UK'], 
     ['Emma', '43', 'UK'], 
     ['Lucy', '25', 'AU']] 
>>> set(element[-1] for element in l) 
('AU', 'UK') 
1

Вы можете использовать NumPy:

import numpy as np 

arr = np.array([['John', '35', 'UK'], 
       ['Emma', '43', 'UK'], 
       ['Lucy', '25', 'AU']]) 

unique = np.unique(arr[:,2]) 
4

Вы можете использовать list comprehension:

>>> L = [['John', '35', 'UK'], 
['Emma', '43', 'UK'], 
['Lucy', '25', 'AU']] 
>>> set([i[2] for i in L]) 
set(['AU', 'UK']) 
1

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

так, как использовать панд в этом случае:

In [17]: import pandas as pd 

In [18]: a = [['John', '35', 'UK'], 
    ....: ['Emma', '43', 'UK'], 
    ....: ['Lucy', '25', 'AU']] 

In [19]: b = pd.DataFrame(a) 

In [20]: b 
Out[20]: 
     0 1 2 
0 John 35 UK 
1 Emma 43 UK 
2 Lucy 25 AU 

In [21]: b[2].unique() 
Out[21]: array(['UK', 'AU'], dtype=object) 

In [22]: 
+0

спасибо! Я действительно должен заглянуть в Панду, чтобы получить гибкость в манипулировании данными. Является ли Panda также выходом в модуль Python для выполнения запросов, связанных с SQL-агрегацией? – bsuire

+0

для одного, поддержка pandas для чтения sql-запроса; для других, pandas действительно поддерживают SQL-подобные запросы агрегации, проверьте здесь: http://pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html, поверьте мне, если вы используете python, делайте работу, связанную с наукой о данных, ipython , панды, numpy, scipy, matplotlib, seaborn, mpld3. и т. д. - лучшее оружие, которое вам нужно –

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