2016-05-14 11 views
0

Ich habe Tabelle in der Datenbank, die Liste des Namens mit 2 oder 3 Wörtern enthalten. Also möchte ich, dass, wenn Benutzer eine Zeichenfolge in Eingabe eingeben, dann wird diese Zeichenfolge in Zeichen weise aufgeteilt dann jedes Zeichen mit String in der Datenbank übereinstimmen.In atlast welcher Zeichenfolge mehr Zeichen der Benutzerzeichenfolge dieses Ergebnis wird in Array nach Zeichen gespeichert werden Match.Es hängt auch Benutzereingabe String-Muster.Wie Daten in der Datenbank mit Django suchen?

ich Ihnen ein Beispiel gebe, dass ich

unter Namen

In Tabelle wollen, gespeichert sind

Neeraj Kumar 
Pankaj Sharma 
Rahul kapoor 

Benutzereingabezeichenfolge ist:

rkp 

dann wird zur Folge haben:

1.Rahul Kapoor 
2.Neeraj Kumar 
3.Pankaj Sharam 

Grund:

Rahul kapoor has R,K and p which match all character with user string pattern 
Pankaj Sharma has p,k,r which match all characters but its user string patter is wrong so it should be at after above name 
Neeraj Kumar has r and k which match 2 and follow user string pattern 

Ich mag diese Suche in Django-Framework mit weniger Code, aber trotzdem kann jeder Code in jeder Sprache geben.

Ich denke auch, das nützlich für andere zu machen Suche besser

Antwort

0

Es iregex ist unabhängig ein QuerySet Fall zu filtern, wie diese

Entry.objects.filter(name__iregex=r'[rkp]') 

die alle Entry Objekte zurückkehren würde, die eine name mit irgendwelchen haben (becaue []) der Zeichen.

Dann können Sie die Sortierung in Python tun.

EDIT:

Dies sollte es tun.

names = ['Neeraj Kumar', 'Pankaj Sharma', 'Rahul kapoor'] 
letters = 'rkp' 

# All lower case to be case insensitive 
data = [x.lower() for x in names] 
chars = list('rkp'.lower()) 

# Result groups collectors 
d1, d2, d3 = [], [], [] 

for item in data: 
    # Find the places for all chars in the name 
    indexes = [item.find(c) for c in chars if item.find(c) >= 0] 

    if len(indexes) == len(chars): 
     # All chars found 
     if indexes == sorted(indexes): 
      # Same order as chars 
      d1.append(names[data.index(item)]) 
     else: 
      # Different order 
      d2.append(names[data.index(item)]) 

    elif len(indexes) > 0: 
     # Not all, but some found 
     d3.append(names[data.index(item)]) 

print(d1, d2, d3) 
+0

Es gibt bessere gefilterte Daten, aber die Reihenfolge der Daten so wie sie in der Datenbank mit serial.Wie ändern der Reihenfolge der Daten, die mehr Zeichen übereinstimmen Eingabezeichenkette. – Amit

+0

Ich habe meiner Antwort ein Skript hinzugefügt, das die Sortierung durchführt. – C14L

+0

Ich füge auch das gleiche Skript wie das Skript hinzu, das genau die Ausgabe liefert, die ich möchte. – Amit

0
names = ['Neeraj Kumar', 'Pankaj Sharma', 'Rahul kapoor'] 
letters = "rkp" 
# All lower case to be case insensitive 
data = [x.lower() for x in names] 
chars = list(letters.lower()) 

# Result groups collectors 
d1,x= [],[] 
for item in data: 
    indexes = [item.find(c) for c in chars if item.find(c) > 0] 
    d1.append(len(indexes)) 
for i in range(len(names)): 
    if max(d1) != 0: 
     pos = d1.index(max(d1)) 
     x.append(names[pos]) 
     del d1[pos] 
     del names[pos] 
print(x) 

Dies ist besser, weil, wenn eine Listendaten jedes Zeichen der Eingabezeichenfolge nicht entsprechen wird, die nicht zeigen und alle Spieldaten werden in einzelne Liste mit der Reihenfolge der passenden Zeichen gespeichert.

Verwandte Themen