2015-10-15 5 views
1

У меня есть следующие структуры данных:Свести список списков с твистом

a= [ 
     [u'happy', u'thursday', u'from', u'my', u'big', u'sweater', u'and', u'this', 
     u'ART', u'@', u'East', u'Village', u',', u'Manhattan', u'https', 
     u':', u'//t.co/5k8PUInmqK'], 
     [u'RT', u'@', u'MayorKev', u':', u'IM', u'SO', u'HYPEE', u'@', u'calloutband', 
     u'@', u'FreakLikeBex', u'#', u'Callout', u'#', u'TheBitterEnd', u'#', 
     u'Manhattan', u'#', u'Music', u'#', u'LiveMusic', u'#', u'NYC', 
     u'#', u'NY', u'#', 
     u'Jersey', u'#', u'NJ', u'http', u':', u'//t.co/0\u2026'] 
    ] 

Как я вижу это, есть список списков строк, за исключением того, что окутано парой [], а чем of(). Пара [] является система генерируются в результате:

a = [nltk.tokenize.word_tokenize(tweetL) for tweetL in tweetList] 

В конечном счете, мне нужно, чтобы сгладить эту структуру, чтобы список строк и провести некоторое регулярное выражение и подсчет операций на словах, а внешняя пара [] предотвращает это.

Я пытался использовать:

list.extend() 

и

ll = len(a) 
for n in xrange(ll): 
    print 'list - ', a[n], 'number = ', n 

, но до сих пор получить тот же результат:

list - [ number = 1 
list - u number = 2 
list - ' number = 3 
list - h number = 4 
list - a number = 5 
list - p number = 6 
list - p number = 7 

Как вы можете видеть, код считает каждый символ из string как элемент списка, а не рассматривать целую строку как элемент

Что можно сделать эффективно?

попытался это:

flat_list = [i for sublist in a for i in sublist] 
for i in flat_list: 
    print 'element - ', i 

результат (частичное):

element - h 
element - a 
element - p 
element - p 
element - y 
element - 
element - t 
+0

я думаю, что есть строка в коде, который бросает в виде строки, а не в списке списков. это не проблема с дополнительной скобкой –

+0

, и ваш результат тоже кажется неправильным, у вас есть еще одна строка, в которой говорится «list - [number = 0'? – zehnpaard

+0

Возможный дубликат [Создание списка из списка списков в Python] (http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in- python) – TigerhawkT3

ответ

1

Вложенный список понимание должно решить первую проблему.

a = [token for tweetL in tweetList for token in nltk.tokenize.word_tokenize(tweetL)] 

Эта конструкция позволяет вам перебирать элементы, найденные из вложенных циклов. Верхняя часть для цикла всегда на первом месте, затем вторая самая внешняя и т. Д. До самой внутренней для цикла, которая приходит последней.

Это может помочь понять, что это эквивалентно:

a = [] 
for tweetL in tweetList: 
    for token in nltk.tokenize.word_tokenize(tweetL): 
     a.append(token) 

В Python 2, вы можете кодировать юникод строки с UTF-8. Это преобразует их с unicode типа в тип str, который должен решить UnicodeEncodeError.

Пример:

u'\u2713'.encode('utf-8') 

Для получения дополнительной информации о Python 2 Unicode, вы можете прочитать здесь: https://docs.python.org/2/howto/unicode.html

+0

Спасибо! Можно ли включить unicoding в ваш вложенный оператор? Я не хочу его печатать. Конечный результат, который я ищу, состоит в том, чтобы все вписать в список строк. Я намерен использовать эти строки с регулярным выражением (для очистки строк), получая в конечном итоге некоторую статистику. – Toly

+0

@Toly Да, любое допустимое выражение Python может использоваться в самой левой части понимания списка, поэтому 'token.encode ('utf-8')' может легко заменить «токен» так: 'a = [токен .encode ('utf-8') для tweetL в tweetList для токена в nltk.tokenize.word_tokenize (tweetL)] ' – Shashank

+0

Wow !! Абсолютно здорово !! Решил все мои проблемы! Спасибо Шашанку и всем, кто помогал мне! Очень ценили и многому научились! – Toly

2

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

a = a[0] 

Это просто дал бы вам один список.

Тогда вы можете просто просто перебирать как:

for i in a: 
    print(i) 

Однако, если это всего лишь пример, и вы на самом деле есть что-то вроде этого:

[[],[],[],[]] 

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

flat_list = [i for sublist in a for i in sublist] 

Тогда вы с предполагают иметь единый список, как: [1, 2, 3, 4]

Тогда вы просто перебирать то, что вы хотите:

for i in flat_list: 
    print(i) 

В качестве альтернативы, если вы желаете, чтобы распечатать индекс, а затем вы можете сделать это:

for i, v in enumerate(flat_list): 
    print("{}: {}".format(i, v)) 

Только окончательный комментарий об использовании вами продления.

extend в качестве помощи для метода гласит:

extend(...) 
    L.extend(iterable) -- extend list by appending elements from the iterable 

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

a = [1, 2, 3] 
b = [4, 5, 6] 
a.extend(b) 
# a will now be [1, 2, 3, 4, 5, 6] 

Running ввод:

a = [[u'happy', u'thursday', u'from', u'my', u'big', u'sweater', u'and', u'this', u'ART', u'@', u'East', u'Village', u',', u'Manhattan', u'https', u':', u'//t.co/5k8PUInmqK'], [u'RT', u'@', u'MayorKev', u':', u'IM', u'SO', u'HYPEE', u'@', u'calloutband', u'@', u'FreakLikeBex', u'#', u'Callout', u'#', u'TheBitterEnd', u'#', u'Manhattan', u'#', u'Music', u'#', u'LiveMusic', u'#', u'NYC', u'#', u'NY', u'#', u'Jersey', u'#', u'NJ', u'http', u':', u'//t.co/0\u2026']] 

по моему коду, дает этот выход:

0: happy 
1: thursday 
2: from 
3: my 
4: big 
5: sweater 
6: and 
7: this 
8: ART 
9: @ 
10: East 
11: Village 
12: , 
13: Manhattan 
14: https 
15: : 
16: //t.co/5k8PUInmqK 
+0

Сделайте эту первую строку /// a = a [0] – Prune

+0

cheers @Prune. Спасибо за это. – idjaw

+0

@idjaw - к сожалению, я уже пробовал это и некоторые другие средства. Он по-прежнему возвращает единственный символ за раз для моей структуры данных (а не «слова»). это то, что у меня есть, когда я попробовал ваше решение выше: h a p p как столбец – Toly

1
a= [[u'happy', u'thursday', u'from', u'my', u'big', u'sweater', u'and', u'this', u'ART', u'@', u'East', u'Village', u',', u'Manhattan', u'https', u':', u'//t.co/5k8PUInmqK'], [u'RT', u'@', u'MayorKev', u':', u'IM', u'SO', u'HYPEE', u'@', u'calloutband', u'@', u'FreakLikeBex', u'#', u'Callout', u'#', u'TheBitterEnd', u'#', u'Manhattan', u'#', u'Music', u'#', u'LiveMusic', u'#', u'NYC', u'#', u'NY', u'#', u'Jersey', u'#', u'NJ', u'http', u':', u'//t.co/0\u2026']] 

from itertools import chain 

flat_a = list(chain.from_iterable(a)) 

['happy', 'thursday', 'from', 'my', 'big', 'sweater', 'and', 'this', 'ART', '@', 'East', 'Village', ',', 'Manhattan', 'https', ':', '//t.co/5k8PUInmqK', 'RT', '@', 'MayorKev', ':', 'IM', 'SO', 'HYPEE', '@', 'calloutband', '@', 'FreakLikeBex', '#', 'Callout', '#', 'TheBitterEnd', '#', 'Manhattan', '#', 'Music', '#', 'LiveMusic', '#', 'NYC', '#', 'NY', '#', 'Jersey', '#', 'NJ', 'http', ':', '//t.co/0…'] 

print(flat_a) 
+0

с сожалением, у меня все еще есть одна и та же проблема ['[', 'u', '' ',' h ',' a ',' p ',' p ',' y ',' '', ',', '', 'u', '' ',' t ',' h ',' u ',' r ',' s ',' d ',' a ',' y ',' '', ',', '', 'u', '' ',' f ',' r ',' o ',' m ', "'", ',', '', 'u', '' ',' m ',' y ',' '', ',', '', 'u', '' ',' b ',' i ',' 'g', '' ',', ',' ',' u ',' '', 's', 'w', 'e', ​​'a' в качестве вывода. Я совершенно озадачен, почему он не работает. Я использую Python 2.7, на всякий случай – Toly

+0

, поэтому в версии 2.7 он даже не сгладил список. Странно это для моего в python 3. Попробуйте запустить этот flat_a = list (chain (* a)) – LetzerWille

+0

Я забираю его. Он работает, когда есть «конверт» от [] !! Проблема заключалась в том, что команда перед wordTokenLw = ','. Join (map (str, wordToken)) удалила конверт [], и теперь она выглядит как [u'happy ', u'thursday', u'from ', u 'мой',], [u'big ', u'sweater', u'and ', u'this', u'art ', u' @ ', u]. Теперь вам нужно выяснить, как сделать вашу операцию над этой структурой. попробовал wordTokenLw [1], wordTokenLw [2], но получил только u '. Извините за мою ошибку!! – Toly

1
a= [[u'happy', u'thursday', u'from', u'my', u'big', u'sweater', u'and', u'this', u'ART', u'@', u'East', u'Village', u',', u'Manhattan', u'https', u':', u'//t.co/5k8PUInmqK'], [u'RT', u'@', u'MayorKev', u':', u'IM', u'SO', u'HYPEE', u'@', u'calloutband', u'@', u'FreakLikeBex', u'#', u'Callout', u'#', u'TheBitterEnd', u'#', u'Manhattan', u'#', u'Music', u'#', u'LiveMusic', u'#', u'NYC', u'#', u'NY', u'#', u'Jersey', u'#', u'NJ', u'http', u':', u'//t.co/0\u2026']] 
for L in a: 
    for e in L: 
     print "element "+e 


element happy 
element thursday 
element from 
element my 
element big 
element sweater 
element and 
element this 
element ART 
element @ 
element East 
+0

элегантный! в то время как я не уверен, почему это работает :) – Toly

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