使用python分离存储在列表中的不同类型的内容

时间:2016-01-18 18:54:24

标签: python

我有一个包含以下格式的奥斯卡提名者的列表。

Birdman 2014    4   9    
The Grand Budapest Hotel    2014    4   9   
Whiplash    2014    3   5    

我要做的是将它们分为不同的类别:MovieYearoscarsnominations

我无法使用空白区域将它们分开,因为电影标题中有空格。关于我如何能做到这一点的任何想法。

4 个答案:

答案 0 :(得分:2)

我会试试这个:

#I assume the data is in 'text' as a string.
data = text.split()
Movie, Year, oscars, nominations = ''.join(data[:-3]), data[-3], data[-2], data[-1]

因此,考虑到数据在列表中,可以在for循环中加载:

# list_of_lines is a list where each item is a line of data
whole_data = list()
for text in line_of_lines:
    data = text.split()
    whole_data.append({'title':''.join(data[:-3]), 'year': data[-3], 'oscars': data[-2], 'nominations': data[-1]})
    # Do something with your info

答案 1 :(得分:0)

您可以尝试在python中使用字典。

http://www.tutorialspoint.com/python/python_dictionary.htm

dict_var = {'title': 'Birdman', 'releasedate': 2014};

访问它们:

dict_var['title'] == 'Birdman'
dict_var['releasedate'] == 2014

答案 2 :(得分:0)

您可以简单地将电影条目分成这四个字段:

str = "The Grand Budapest Hotel    2014    4   9   "
tmp = str.split()
[" ".join(tmp[0:len(tmp)-3])] + tmp[len(tmp)-3:len(tmp)]

答案 3 :(得分:0)

你能否利用包含模糊空间的唯一信息单位是标题?例如:

a = 'Birdman 2014 4 9'
b = 'The Grand Budapest Hotel 2014 4 9'

如果我们使用split将其分解为单词:

>>> aa.split()
['Birdman', '2014', '4', '9']
>>> bb.split()
['The', 'Grand', 'Budapest', 'Hotel', '2014', '4', '9']

我们得到不同计数的列表(分别为4和7)。但我们知道nominations将永远是最后一个而且只是最后一个字。 Python的反向索引在这里非常好。

>>> aa = a.split()
>>> bb = b.split()
>>> aa[-1]
'9'
>>> bb[-1]
'9'

我们也可以为oscarsyear编制索引:

>>> aa[-2] # oscars
'4'
>>> bb[-2] # oscars
'4'
>>> aa[-3] # year
'2014'
>>> bb[-3] # year
'2014'

如果您需要将这些字词重新转换为数字,请使用int()功能。要获得标题,我们可以使用相同的反向索引访问列表的一部分。

>>> aa[0:-3] # title
['Birdman']
>>> bb[0:-3] # title
['The', 'Grand', 'Budapest', 'Hotel']

请注意,[0:-3]可以简单地写为[:-3],0是:字符左侧表示的起始索引的默认值。

一个或多个单词的列表可能不是您想要表达标题的方式,因此要将它们重新转换为单个字符串,请使用join()方法:

>>> awords = aa[:-3]
>>> aWords = aa[:-3]
>>> bWords = bb[:-3]
>>> ' '.join(aWords)
'Birdman'
>>> ' '.join(bWords)
'The Grand Budapest Hotel'

如果您要做很​​多事情,我会编写一个简单的解析器,将您的单行字符串转换为更结构化的字符串。让我们使用一个带有命名字段的简单对象:

class MovieRecord(object):
    pass

(您也可以使用命名元组或字典,但我认为类总是很好,因为随着程序的增长,我可以将行为绑定到自然适合它的对象数据,另一个选项是一种更平坦,更静态的方法,往往会导致整个程序中没有很好地封装行为。)

现在我们需要一个函数来将单个文本行解析为MovieRecord。采取我们上面建立的:

def parseMovie(line):
    newRecord = MovieRecord()
    words = line.split()
    newRecord.name = ' '.join(words[:-3])
    newRecord.year = int(words[-3])
    newRecord.oscars = int(words[-2])
    newRecord.nominations = int(words[-1])
    return newRecord

测试出来:

>>> sample = 'The Grand Budapest Hotel 2014 4 9'
>>> record = parseMovie(sample)
>>> record.name
'The Grand Budapest Hotel'
>>> record.year
2014
>>> record.oscars
4
>>> record.nominations
9

现在不多了。给定这些行的文件,我们可以利用python喜欢默认读取文件行的​​事实:

with open('yourListOfMovies', 'r') as file:
    allMovies = [parseMovie(line) for line in file]