2014-05-10 2 views
0

Comment faire plusieurs listes comme ceci:Modifier la liste en python

['The Lord of the Rings: The Fellowship of the Ring (2001)'] 

['The Lord of the Rings: The Two Towers (2002)'] 

['"5 Second Movies" (2007) {The Lord of the Rings and the Two Towers (#1.63)}'] 

Dans une telle liste:

['The Lord of the Rings: The Fellowship of the Ring (2001)', 
'The Lord of the Rings: The Two Towers (2002)', 
'"5 Second Movies" (2007) {The Lord of the Rings and the Two Towers (#1.63)}'] 

J'ai essayé:

x = open("ratings.list.txt","r") 
movread = x.readlines() 
x.close() 



#s = raw_input('Search: ').lower() 
for ns in movread: 


    if 'the lord of the' in ns.lower(): 
     d = re.split('\s+',ns,4) 
     Title = d[4].rstrip() 
     Rating= d[3] 



     lists = [Title] 

     combined = [item for sublist in lists for item in sublist] 
     print combined 

Mais son donne moi cette sortie:

['T', 'h', 'e', ' ', 'L', 'o', 'r', 'd', ' ', 'o', 'f', ' ', 't', 'h', 'e', ' ', 'R', 'i', 'n', 'g', 's', ':', ' ', 'T', 'h', 'e', ' ', 'R', 'e', 't', 'u', 'r', 'n', ' ', 'o', 'f', ' ', 't', 'h', 'e', ' ', 'K', 'i', 'n', 'g', ' ', '(', '2', '0', '0', '3', ')'] 
['T', 'h', 'e', ' ', 'L', 'o', 'r', 'd', ' ', 'o', 'f', ' ', 't', 'h', 'e', ' ', 'R', 'i', 'n', 'g', 's', ':', ' ', 'T', 'h', 'e', ' ', 'F', 'e', 'l', 'l', 'o', 'w', 's', 'h', 'i', 'p', ' ', 'o', 'f', ' ', 't', 'h', 'e', ' ', 'R', 'i', 'n', 'g', ' ', '(', '2', '0', '0', '1', ')'] 

Merci pour l'aide les gars: D

MISE À JOUR

Le look de fichier comme celui-ci (son d'une liste de tous les films sur IMDB, de sorte que la taille est énorme):

New Distribution Votes Rank Title 
     0000000125 1196672 9.2 The Shawshank Redemption (1994) 
     0000000125 829707 9.2 The Godfather (1972) 
     0000000124 547511 9.0 The Godfather: Part II (1974) 
     0000000124 1160800 8.9 The Dark Knight (2008) 
     0000000124 920221 8.9 Pulp Fiction (1994) 
     0000000124 358790 8.9 Il buono, il brutto, il cattivo. (1966) 
     000000.9 Schindler's List (1993) 
     0000000133 297241 8.9 12 Angry Men (1957) 
     0000000124 854409 8.9 The Lord of the Rings: The Return of the King (2003) 
     000000.8 Fight Club (1999) 
     0000000124 880827 8.8 The Lord of the Rings: The Fellowship of the Ring (2001) 
     000000.8 Star Wars: Episode V - The Empire Strikes Back (1980) 
     0000000124 953140 8.7 Inception (2010) 
+0

Que diriez-vous juste de '[sub [0] pour sub dans l'original]'? –

+0

Je vous suggère de lire le fichier et de le diviser par newlines plutôt que par caractère. –

+0

Comment je fais ça? Je ne suis pas bon en python juste commencé avec ça! @ Stupid.Fat.Cat –

Répondre

0

vous voulez

[movie[0] for movie in movies] 

Un exemple de script ressemblerait à ceci

import pprint  

movies = [ 
['The Lord of the Rings: The Fellowship of the Ring (2001)'], 
['The Lord of the Rings: The Two Towers (2002)'], 
['"5 Second Movies" (2007) {The Lord of the Rings and the Two Towers (#1.63)}'], 
] 

pprint.pprint([movie[0] for movie in movies], indent=4) 

Ce sorties

[ 'The Lord of the Rings: The Fellowship of the Ring (2001)', 
    'The Lord of the Rings: The Two Towers (2002)', 
    '"5 Second Movies" (2007) {The Lord of the Rings and the Two Towers (#1.63)}'] 

La liste movies, serait peuplée par vous lorsque vous lisez dans le fichier.

+0

mon problème est que c'est un fichier énorme avec plus de listes que les trois je vous ai montré! –

+0

les listes ne sont pas séparées par une virgule –

+0

Lisez votre fichier par ligne, en ajoutant chaque ligne à la liste des films. Ensuite, ils seront séparés par des virgules – Andy

0

les lisant sous forme de lignes à partir d'un fichier texte, vous pouvez effectuer les opérations suivantes:

On dirait que vous voulez être en mesure de rechercher des titres, donc dans ce cas:

search = raw_input("Enter title: ").lower() 

with open("ratings.list.txt") as f: 
    titles = [line for line in f if search in line.lower()] 

ce code vous renvoie la ligne entière. Ce que vous faites avec la ligne dépend de vous.

Par exemple, pour extraire le titre + année de la ligne, vous pouvez faire:

for title in titles: 
    print title.strip().split(' ', 6) 

exemple:

Si la ligne était:

 0000000125 1196672 9.2 The Shawshank Redemption (1994) 

sortie serait :

['0000000125', '', '1196672', '', '', '9.2', ' The Shawshank Redemption (1994)'] 
+0

mon problème est que c'est un fichier énorme avec plus de listes que les trois je vous ai montré! –

+0

Alors y a-t-il plus que des titres de films dans ce fichier? – Totem

+0

Si ce fichier ne contient que des titres de films, un sur chaque ligne, alors le code ci-dessus pour ouvrir le fichier texte devrait faire l'affaire – Totem

0

Il semble que votre problème actuel soit beaucoup plus complexe que la simple question d'ajouter des listes. Vous pourriez envisager une base de données pour les résultats.

Mais en ce qui concerne votre question initiale:

Si vous essayez juste de réduire la liste des listes dans une liste de chaînes, il y a une astuce, utiliser sum:

>>> listoflists = [['abc'],['def'],['g'],['abc'],['abcdefg']] 
>>> sum(listoflists,[]) 
['abc', 'def', 'g', 'abc', 'abcdefg'] 

Vous pourriez utiliser également la compréhension de la liste, qui était en fait plus rapide dans mon test:

combined = [ x[0] for x in listoflists ] 

Mais le moyen le plus rapide, si les éléments sont des éléments de la liste, serait de les ajouter t o combined que vous créez au lieu d'exiger une boucle séparée à la fin:

#Outside the loop 
combined = [] 

# inside the loop 
title = d[4].rstrip() 
lists = [title] 
combined += lists 

Il semble y avoir aucune raison de cette variable intermédiaire Lists, cependant, et au lieu simplement utiliser:

title = d[4].rstrip() 
combined.append(title) 

Vous voulez probablement déplacer votre print combined en dehors de la boucle afin qu'il imprime juste à la fin.