Estoy haciendo un ejercicio en el que necesito buscar el nombre exacto de la función de la lista fun y obtener la información correspondiente de otra lista detail.

Aquí está la lista dinámica detail:

csvCpReportContents =[
['[PLT] rand (DEBUG INFO NOT FOUND)', '11', '15'],
['rand', '10', '11', '12'],
['__random_r', '23', '45'],
['__random', '10', '11', '12'],
[],
['multiply_matrices()','23','45'] ]

Aquí está la lista fun que contiene el nombre de la función a buscar:

fun = ['multiply_matrices()','__random_r','__random']

Salida esperada para la función fun[2]

 ['__random', '10', '11', '12']

Salida esperada para la función fun[1]

['__random_r', '23', '45'],

Aquí lo que he intentado para fun[2]:

for i in range(0, len(csvCpReportContents)):
    row = csvCpReportContents[i]
    if len(row)!=0:
        search1 = re.search("\\b" + str(fun[2]).strip() + "\\b", str(row))
        if search1:
            print(csvCpReportContents[i])

Sugiérame cómo buscar la palabra exacta y obtener solo esa información.

-2
Ratnesh 3 oct. 2019 a las 12:52

4 respuestas

La mejor respuesta

Para cada función divertida, puede iterar a través de la lista csv comprobando si el primer elemento comienza con ella

csvCpReportContents = [
    ['[PLT] rand (DEBUG INFO NOT FOUND)', '11', '15'],
    ['rand', '10', '11', '12'],
    [],
    ['multiply_matrices()', '23', '45']]

fun=['multiply_matrices()','[PLT] rand','rand']

for f in fun:
    for c in csvCpReportContents:
        if len(c) and c[0].startswith(f):
            print(f'fun function {f} is in csv row {c}')

SALIDA

fun function multiply_matrices() is in csv row ['multiply_matrices()', '23', '45']
fun function [PLT] rand is in csv row ['[PLT] rand (DEBUG INFO NOT FOUND)', '11', '15']
fun function rand is in csv row ['rand', '10', '11', '12']

Código actualizado desde que cambió los casos de prueba y el requisito en la pregunta. Mi primera respuesta se basó en tus casos de prueba de que querías unir las líneas que comenzaron con el artículo por diversión. Ahora parece que ha cambiado ese requisito para que coincida con una coincidencia exacta y, si no coincide, una coincidencia comienza con una coincidencia. Debajo del código actualizado para manejar ese escenario. Sin embargo, diría que la próxima vez sea claro en su pregunta y no cambie los criterios después de que varias personas hayan respondido

csvCpReportContents =[
['[PLT] rand (DEBUG INFO NOT FOUND)', '11', '15'],
['rand', '10', '11', '12'],
['__random_r', '23', '45'],
['__random', '10', '11', '12'],
[],
['multiply_matrices()','23','45'] ]

fun = ['multiply_matrices()','__random_r','__random','asd']

for f in fun:
    result = []
    for c in csvCpReportContents:
        if len(c):
            if f == c[0]:
                result = c
            elif not result and c[0].startswith(f):
                result = c

    if result:
        print(f'fun function {f} is in csv row {result}')
    else:
        print(f'fun function {f} is not vound in csv')

SALIDA

fun function multiply_matrices() is in csv row ['multiply_matrices()', '23', '45']
fun function __random_r is in csv row ['__random_r', '23', '45']
fun function __random is in csv row ['__random', '10', '11', '12']
fun function asd is not vound in csv
2
Chris Doyle 4 oct. 2019 a las 08:00

La entrada anterior es una lista anidada, por lo que debe considerar la indexación 2D, como l = [[1,2,3,4], [2,5,7,9]] para encontrar el elemento de 3 números, debe usar el índice de l [0] [2]

1
Mandava Geethabhargava 3 oct. 2019 a las 10:00

Con la función personalizada search_by_func_name:

csvCpReportContents = [
    ['[PLT] rand (DEBUG INFO NOT FOUND)', '11', '15'],
    ['rand', '10', '11', '12'],
    [],
    ['multiply_matrices()', '23', '45']]

fun = ['multiply_matrices()', '[PLT] rand', 'rand']


def search_by_func_name(name, content_list):
    for lst in content_list:
        if any(i.startswith(name) for i in lst):
            return lst


print(search_by_func_name(fun[1], csvCpReportContents))  # ['[PLT] rand (DEBUG INFO NOT FOUND)', '11', '15']
print(search_by_func_name(fun[2], csvCpReportContents))  # ['rand', '10', '11', '12']
1
RomanPerekhrest 3 oct. 2019 a las 10:02

También puede usar la función call_fun como lo hice en el siguiente código.

def call_fun(fun_name):
    for ind,i in enumerate(csvCpReportContents):
        if i:
            if i[0].startswith(fun_name):
                return csvCpReportContents[ind]

# call_fun (diversión [2])

# ['rand', '10', '11', '12']

1
Rajeshkumar 4 oct. 2019 a las 09:45
58216584