2016-01-18 2 views
0

У меня есть список, содержащий номинанты на премию «Оскар» в следующем формате.Разделение содержимого различных типов, хранящихся в списке с использованием python

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

То, что я пытаюсь сделать, это разделить их по разным категориям: Movie, Year, oscars, nominations.

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

+0

Используйте регулярное выражение. –

+2

Вы что-то пробовали? Отправьте код, который вы использовали. – Gabriel

+0

Возможно, вам понадобится посмотреть формат вкладок для ввода. – mattsap

ответ

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] 

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

# 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 
+0

Это самый чистый путь. +1 – Gabriel

+0

tglaria, я бы добавил немного кода, так как это обрабатывает входные данные по строкам. Возможно, добавьте блок 'for' для прохождения каждой строки в' data' и сохраните результаты в словаре. – Gabriel

+0

спасибо, это прекрасно. Я пытался разбить их, но не мог понять, как это сделать. , это работает очень хорошо, спасибо. – wizzer

0

Вы можете попробовать использовать словарь в python.

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

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

И доступ к ним:

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

привет, да, я думал о словаре, но есть 1100 разных фильмов, поэтому потребуется много работы. – wizzer

+0

Достаточно честный. В языках сценариев, таких как Python, если у вас есть большие наборы данных, подобные этому, часто может быть хорошей идеей перебирать все из них (таким образом, чтобы вы не проходили каждый по одному) и сохраняли их в доступным способом. Но есть много решений, поэтому я рад, что вы его нашли! В качестве побочного примечания вы можете использовать цикл for для итерации по каждому элементу в коллекции, чтобы вам не приходилось делать вещи один за другим. – BleepBloopOverflow

0

Вы можете просто разделить запись фильма в этих четырех областях делают это:

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

привет, было 1100 фильмов в списке, поэтому было бы слишком много работы, делая каждый фильм по отдельности, но спасибо за ответ – wizzer

+0

Просто используйте цикл. Это пример для одиночной записи в этом списке. – Marqin

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' 

Мы можем индексировать oscars и year, а также:

>>> 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] 
+0

Вау, спасибо, это очень информативно. – wizzer

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