2017-04-22 2 views
-2

Je n'ai pas pu résoudre ce problème lors d'une interview. Seul un tableau 1D doit être utilisé strictement. Les noms fournis doivent être disposés de telle sorte que Priorité 1) Noms avec la première lettre du prénom, Priotité 2) Les noms avec la première lettre du deuxième nom devraient apparaître ensuite Priorité 3) les noms qui contiennent cette lettre seulement. Les noms qui ne contiennent pas la lettre doivent être omis. L'ordre des noms dans ces 3 ensembles de noms n'a pas d'importance. La lettre et la liste des noms seront fournies par l'utilisateur. Je préfère chercher une solution python. Exemple de question:Trier les noms en utilisant un seul tableau 1D basé sur une lettre fournie avec Python

Entrée:

'Jacob Rand,Hari Ram,Rambo Singh,Satish Kumar,Raghvan Kumar,Sam Keshav' 

Lettre:

R 

Ma sortie:

'Rambo Singh', 'Raghvan Kumar', 'Jacob Rand', 'Hari Ram' 

Résultats escomptés:

'Rambo Singh', 'Raghvan Kumar', 'Jacob Rand', 'Hari Ram', 'Satish Kumar' 

code (ce qui ne va pas, je l'ai utilisé plusieurs tableaux + pas de traitement différence dans r/R (inférieur/Majuscule)):

#Please note that I am looking for program which uses a single array 
set1=[] 
set2=[] 
set3=[] 
def arranged(Letter,nameList): 
    nameListNew=nameList.split(',') 
    for eachName in nameListNew: 
     if Letter in eachName: 
      if Letter==eachName[0]: 
       set1.append(eachName) 
      else: 
       secondName=eachName.split(' ') 
       if Letter==secondName[0]: 
        set2.append(eachName) 
       else: 
        set3.append(eachName) 
    OutputArray=set1+set2+set3 
    print(OutputArray) 

listOfNames='Jacob Rand,Hari Ram,Rambo Singh,Satish KumaR,Raghvan Kumar,Sam Keshav' 
arranged('R', listOfNames) 
+0

Qu'avez-vous essayé? – Dashadower

+0

Je ne pouvais pas. J'ai fait 3 tableaux pour le faire et finalement je les ai rejoints: P. L'intervieweur l'a rejeté complètement. –

+0

Montrez votre effort, même s'il a échoué, et nous serons beaucoup plus susceptibles de vous aider. Assurez-vous d'expliquer quelle sortie votre tentative a rapporté et pourquoi elle était fausse. En passant, l'énoncé du problème n'est pas complètement clair. Si un nom satisfait plus d'une de ces exigences, devrait-il être listé seulement dans l'ordre de la première exigence satisfaite ou à plusieurs reprises? Qu'en est-il des noms uniques: doivent-ils être traités comme des prénoms ou des noms de famille? Qu'en est-il des prénoms ou plus de deux noms? –

Répondre

1

je peux avoir une solution, mais pas correspondant exactement à votre sortie:

def arranged(names, letter): 
    # get names containing letter (case-sensitive) 
    name_arr = [name for name in names.split(",") if letter.lower() in name.lower()] 
    # sort comparing the index of letter in name 
    return sorted(name_arr, key=lambda name: name.find(letter)) 

names = "Jacob Rand,Hari Ram,Rambo Singh,Shyam,Satish Kumar,Raghvan Kumar,Sam Keshav" 
letter = "R" 

print(arranged(names, letter)) 

sortie est:

['Rambo Singh', 'Raghvan Kumar', 'Hari Ram', 'Jacob Rand'] 

Satish Kumar non inclus comme aucun 'R' est présent, et Hari Ram vient avant Jacob Rand, comme Hari est un nom plus court que Jacob (le i de R ndex est plus bas). Il importe également que cette lettre soit un caractère majuscule car les noms sont généralement en majuscules.

+0

Merci mon pote .. Vous êtes génial!un moyen de relier R/r en utilisant la fonction python intégrée? Je veux rendre insensible à la casse? –

+0

@AvinashKumar Oui, vous pouvez utiliser la méthode .lower() dans la liste de compréhension pour inclure le nom indépendamment de la casse. Voir ma réponse éditée. – rolika

+0

le code ci-dessus ne fonctionne pas. Je suppose que la logique que vous avez utilisée ne peut pas être utilisée si nous utilisons lower() car un nom 'Hari Kumar' sera placé avant 'Sashi Rockie' car le premier aura un index plus bas. Je suis satisfait de la version précédente du code. Toute autre logique peut-elle être appliquée? –