Pregunta sobre Test Dome.

Implemente una función group_by_owners que:

Acepta un diccionario que contiene el nombre del propietario del archivo para cada nombre de archivo.

Devuelve un diccionario que contiene una lista de nombres de archivo para cada nombre de propietario, en cualquier orden.

Por ejemplo, para el diccionario {'Input.txt': 'Randy', 'Code.py': 'Stan', 'Output.txt': 'Randy'} la función group_by_owners debería devolver {'Randy': ['Input.txt', 'Output.txt'], 'Stan': ['Code.py']}.

Cuando ejecuto el código a continuación que desarrollé mientras hacía la prueba de ejemplo, obtuve un puntaje de 0% por su aplicación en línea y si ejecuta el código siguiente en su IDE, genera el diccionario transformado correcto.

¿Por qué su sitio no da marcas para las pruebas desarrolladas? ¿Es esto un error con sus algoritmos que detectan si el código es correcto en su sitio? ¿O estoy haciendo algo incorrectamente aquí?

Mi comprensión de Python es de aprox. 2 años de experiencia

'''Find all unique names given a dict'''
def getUniqueNames(file):
    file_owner_names = []
    for file_type, file_o in file.items():
        if file_o not in file_owner_names:
             file_owner_names.append(file_o)

     return file_owner_names

'''Get a list of files for an owner given a dict and owner'''
def getFileArray(file, file_owner):
    file_type_names = []
    for file_t, file_o in file.items():
        if file_o == file_owner:
            if file_t not in file_type_names:
                file_type_names.append(file_t)

    return file_type_names

'''Learned to used the dict'''
def group_by_owners(files_dict):
     new_file = {}
     i = 0
     file_owner_names = getUniqueNames(files_dict)
     for file_owner_name in file_owner_names:
         if i != len(file_owner_names):
              if (i < len(file_owner_names)):
                 new_file[file_owner_name] = str(getFileArray(files_dict, 
                 file_owner_name))
                 i = i + 1

return new_file


files = {
    'Input.txt': 'Randy',
    'Code.py': 'Stan',
    'HomeController.py': 'Randy',
    'Output.txt': 'Jeff',
    'SearchController.py': 'Rafeena',
    'ABTest.py': 'Nicholas',
    'SQL.py':'Nicholas'
 }

 print(group_by_owners(files))

Salida del script de python anterior:

{'Randy': "['Input.txt', 'HomeController.py']", 'Stan': "['Code.py']", 'Jeff': "['Output.txt']", 'Rafeena': "['SearchController.py']", 'Nicholas': "['ABTest.py', 'SQL.py']"}
1
user2480313 11 may. 2019 a las 05:44

4 respuestas

La mejor respuesta

No lo he probado, pero creo que tu problema es que deberías cambiar

new_file[file_owner_name] = str(getFileArray(files_dict, file_owner_name))

Para

new_file[file_owner_name] = getFileArray(files_dict, file_owner_name)

Eliminando la llamada a str.

La salida debería ser:

{'Randy': ['Input.txt', 'HomeController.py'], 'Stan': ['Code.py'], 'Jeff': ['Output.txt'], 'Rafeena': ['SearchController.py'], 'Nicholas': ['ABTest.py', 'SQL.py']}

Observe la falta de comillas alrededor de las listas.

1
Solomon Ucko 11 may. 2019 a las 18:07

No exactamente responde a su pregunta, pero esta solución utiliza un diccionario estándar.

def group_by_owners(files):
    grouped_files = {}

    for key, value in sorted(files.items()):
        grouped_files.setdefault(value, []).append(key)

    return grouped_files

#prints {'Stan': ['Code.py'], 'Randy': ['Input.txt', 'Output.txt']}

Basé mi respuesta en un ejemplo que se encuentra aquí: StackOverflow

1
miriad 18 nov. 2019 a las 01:16

También puede probar el siguiente enfoque simple para obtener el resultado requerido

def group_by_owners(files):
    my_dict = {}
    for key,value in files.items():
        if value in my_dict:
            my_dict[value].append(key)
        else:
            my_dict[value] = [key]
    return my_dict

files = {'Input.txt': 'Randy', 'Code.py': 'Stan', 'Output.txt': 'Randy'}
print(group_by_owners(files))
# Prints {'Randy': ['Input.txt', 'Output.txt'], 'Stan': ['Code.py']}
0
Vishal Kharde 4 dic. 2019 a las 15:05

Puede usar defaultdict de colecciones. Defaultdict se encarga de agregar una nueva clave.

from collections import defaultdict
d = {'Input.txt': 'Randy', 'Code.py': 'Stan', 'Output.txt': 'Randy'}
o = defaultdict(list)
for k, v in d.items():
    o[v] += [k]
print(dict(o))
# prints {'Randy': ['Input.txt', 'Output.txt'], 'Stan': ['Code.py']}
2
Osman Mamun 11 may. 2019 a las 18:21