2015-10-15 56 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'] 
    ] 

我看到这一点的方式,它是一个字符串列表的列表,但它是由一对[]而笼罩()。所述双[]是系统发出的一个结果是:

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 

正如你看到的,代码考虑的每一个符号字符串作为列表的元素,而不是将整个字符串视为元素

什么可以有效地完成?

尝试这样做:

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-蟒蛇) – TigerhawkT3

回答

1

嵌套列表理解应该解决您的第一个问题。

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

此构造允许您遍历嵌套for循环中找到的元素。最外面的循环总是先出现,然后是最外面的第二个等,直到最后一个循环的内部。

这可能有助于理解这相当于:

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

在Python 2,你可以编码Unicode字符串使用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')'可以很容易地替换'token',像这样:'a = [token .token.word_tokenize(tweetL)中的tweetList中的tweetL代码('utf-8')' – Shashank

+0

哇!绝对好!解决了我所有的问题!谢谢Shashank和所有帮助我的人!非常感谢和学到很多东西! – 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] 

运行你输入:

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

欢呼声@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

遗憾的是,我仍然有同样的问题[''','',''','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 =列表(链(* a)) – LetzerWille

+0

我把它收回。当[]有一个“信封”时它确实有效!问题在于wordTokenLw =','。join(map(str,wordToken))之前的命令移除了[]的信封,现在看起来像[u'happy',u'thursday',u'from',u 'my',],[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