Ich habe zwei Dateien Ich möchte eine spezifische Leistung vergleichen und dann produzieren:zwei Listen vergleichen und von einem Feld suchen, Python
1) Im Folgenden wird der Inhalt der Benutzertextdatei ist (dies die neuesten Filme speichert angesehen durch den Benutzer)
Sci-Fi,Out of the Silent Planet
Sci-Fi,Solaris
Romance, When Harry met Sally
2) im Folgenden sind die Inhalte der films.txt Datei, die alle Filme im Programm speichert, die
0,Genre, Title, Rating, Likes
1,Sci-Fi,Out of the Silent Planet, PG,3
2,Sci-Fi,Solaris, PG,0
3,Sci-Fi,Star Trek, PG,0
4,Sci-Fi,Cosmos, PG,0
5,Drama, The English Patient, 15,0
6,Drama, Benhur, PG,0
7,Drama, The Pursuit of Happiness, 12, 0
8,Drama, The Thin Red Line, 18,0
9,Romance, When Harry met Sally, 12, 0
10,Romance, You've got mail, 12, 0
11,Romance, Last Tango in Paris, 18, 0
12,Romance, Casablanca, 12, 0
Ein Beispiel th für den Benutzer verfügbar sind Die Ausgabe, die ich benötige: Der Benutzer hat gerade zwei Sci-Fi und einen Romance Film angeschaut. Die Ausgabe sollte daher die Filmtextdatei nach Genre suchen (SCI-FI und ROMANCE identifizieren) und sollte die Filme in der films.txt-Datei auflisten, die noch NICHT vom Benutzer angesehen wurden. In diesem Fall
3,Sci-Fi,Star Trek, PG,0
4,Sci-Fi,Cosmos, PG,0
10,Romance, You've got mail, 12, 0
11,Romance, Last Tango in Paris, 18, 0
12,Romance, Casablanca, 12, 0
Ich habe den folgenden Code, der die oben genannten zu tun versucht, aber die Ausgabe, die es erzeugt, ist falsch:
def viewrecs(username):
#set the username variable to the text file -to use it in the next bit
username = (username + ".txt")
#open the username file that stores latest viewings
with open(username,"r") as f:
#open the csv file reader for the username file
fReader=csv.reader(f)
#for each row in the fReader
for row in fReader:
#set the genre variable to the row[0], in which row[0] is all the genres (column 1 in username file)
genre=row[0]
#next, open the films file
with open("films.txt","r") as films:
#open the csv reader for this file (filmsReader as opposed to fReader)
filmsReader=csv.reader(films)
#for each row in the films file
for row in filmsReader:
#and for each field in the row
for field in row:
#print(field)
#print(genre)
#print(field[0])
if genre in field and row[2] not in fReader:
print(row)
Ausgang (unerwünschte):
['1', 'Sci-Fi', 'Out of the Silent Planet', ' PG', '3']
['2', 'Sci-Fi', 'Solaris', ' PG', '0']
['3', 'Sci-Fi', 'Star Trek', ' PG', '0']
['4', 'Sci-Fi', 'Cosmos', ' PG', '0']
I Ich möchte keine Umschreibung oder neue Lösung, aber vorzugsweise eine Lösung für die obige Lösung mit ihrem logischen Verlauf ...
@gipsy - Ihre Lösung scheint fast zu funktionieren. Früher habe ich:
def viewrecs(username):
#set the username variable to the text file -to use it in the next bit
username = (username + ".txt")
#open the username file that stores latest viewings
lookup_set = set()
with open(username,"r") as f:
#open the csv file reader for the username file
fReader=csv.reader(f)
#for each row in the fReader
for row in fReader:
genre = row[1]
name = row[2]
lookup_set.add('%s-%s' % (genre, name))
with open("films.txt","r") as films:
filmsReader=csv.reader(films)
#for each row in the films file
for row in filmsReader:
genre = row[1]
name = row[2]
lookup_key = '%s-%s' % (genre, name)
if lookup_key not in lookup_set:
print(row)
Die Ausgabe ist wie folgt: Es druckt alle Linien in allfilms, die nicht in der ersten Gruppe ist, und nicht nur die, die im ersten Satz auf das GENRE basierte:
['0', 'Genre', ' Title', ' Rating', ' Likes']
['3', 'Sci-Fi', 'Star Trek', ' PG', ' 0']
['4', 'Sci-Fi', 'Cosmos', ' PG', ' 0']
['5', 'Drama', ' The English Patient', ' 15', ' 0']
['6', 'Drama', ' Benhur', ' PG', ' 0']
['7', 'Drama', ' The Pursuit of Happiness', ' 12', ' 0']
['8', 'Drama', ' The Thin Red Line', ' 18', ' 0']
['10', 'Romance', " You've got mail", ' 12', ' 0']
['11', 'Romance', ' Last Tango in Paris', ' 18', ' 0']
['12', 'Romance', ' Casablanca', ' 12', ' 0']
HINWEIS: ich änderte das Format des ersten Satzes gleich sein, der Einfachheit halber, der alle Filme Einträge:
1,Sci-Fi,Out of the Silent Planet, PG
2,Sci-Fi,Solaris, PG
ist to_see in Ihrem Code gemeint um movies_to_see zu sein? –
'movies_to_see' ist die Methode,' to_see' ist das Array, das zurückgegeben wird. – Uriel
Ich bin nicht vertraut mit Lambda und der Verwendung von Karten, also wäre es wiederum sehr hilfreich, jede Zeile zu kommentieren. Ich würde versuchen, aber es ist nicht offensichtlich, wo es und seine Bedeutung zu implementieren ... –