2 votes

Comment attribuer une valeur à une chaîne de caractères ?

Je reçois une liste contenant des tuples

par exemple:

a=[('bp', 46), ('sugar', 98), ('fruc', 56), ('mom',65)]

et une liste imbriquée, dans une structure d'arbre

tree= [
    [
        'a',
        'bp',
        [78, 25, 453, 85, 96]
    ],
    [
        ['hi', ['no', ['ho', 'sugar', 3]], ['not', 'he', 20]],
        [['$', 'fruc', 7185], 'might', 'old'],
        'bye'
    ],
    [
        ['not', ['<', 'mom', 385]],
        [
            ['in', 'Age', 78.5],
            [['not', ['and', 'bp', 206]], 'life', [['or', ['not', ['\\', 'bp', 5]], ['p', 'sugar', 10]], 'ordag',[['perhaps', ['deal', 'mom', 79]],
            'helloo',[['or', ['pl', 'mom', 25]], 'come', 'go']]]],
            'noway'
        ],
        [['<', 'bp', 45], 'falseans', 'bye']
    ]
]

Comment puis-je attribuer à la première élément du tuple qui est une chaîne de caractères la valeur qui suit. Parce que par exemple, quand il s'agit de 'mom' dans l'arbre, je veux travailler avec sa valeur. J'ai pensé à créer un dictionnaire mais cela ne fait que mettre ma liste sous une forme différente, cela ne m'aide pas à l'attribuer à une valeur dans l'arbre. Au lieu d'attribuer une valeur à la chaîne, je pourrais aussi travailler en remplaçant la chaîne par sa valeur mais la fonction de remplacement ne fonctionne que dans une chaîne et remplace une chaîne par une autre.

Merci d'avance

1voto

Jean-François Fabre Points 94672

Conseil rapide, fonctionne dans les cas simples.

(note : vous avez une chaîne incorrecte ici: '\' devrait être '\\')

  • convertir la structure en chaîne
  • effectuer le remplacement en utilisant des guillemets simples comme délimiteur pour qu'il soit sûr contre les inclusions de mots dans d'autres mots plus longs
  • analyser à nouveau la chaîne avec les remplacements en utilisant ast.literal_eval qui fait le gros du travail (analyser à nouveau le texte de structure littérale valide en une structure python valide)

code:

arbre= [['a', 'bp', [78, 25, 453, 85, 96]],
[['hi', ['no', ['ho', 'sugar', 3]], ['not', 'he', 20]],
[['$', 'fruc', 7185], 'might', 'old'],
'bye'],[['not', ['<', 'mom', 385]],
[['in', 'Age', 78.5],[['not', ['and', 'bp', 206]],
'life',[['or', ['not', ['\\', 'bp', 5]], ['p', 'sugar', 10]],
'ordag',[['perhaps', ['deal', 'mom', 79]],
'helloo',[['or', ['pl', 'mom', 25]], 'come', 'go']]]],
'noway'],[['<', 'bp', 45], 'falseans', 'bye']]]
a=[('bp', 46), ('sugar', 98), ('fruc', 56), ('mom',65)]

str_arbre = str(arbre)

for before,after in a:
    str_arbre = str_arbre.replace("'{}'".format(before),str(after))

nouvel_arbre = ast.literal_eval(str_arbre)
print(type(nouvel_arbre),nouvel_arbre)

résultat:

 [['a', 46, [78, 25, 453, 85, 96]], [['hi', ['no', ['ho', 98, 3]], ['not', 'he', 20]], [['$', 56, 7185], 'might', 'old'], 'bye'], [['not', ['<', 65, 385]], [['in', 'Age', 78.5], [['not', ['and', 46, 206]], 'life', [['or', ['not', ['\\', 46, 5]], ['p', 98, 10]], 'ordag', [['perhaps', ['deal', 65, 79]], 'helloo', [['or', ['pl', 65, 25]], 'come', 'go']]]], 'noway'], [['<', 46, 45], 'falseans', 'bye']]]

C'est donc un hack mais il est capable de traiter des données contenant des ensembles, des listes, des dictionnaires, des tuples, sans trop de tracas.

1voto

BloodyD Points 720

Je suggérerais une traversée récursive de l'arbre :

a=[('bp', 46), ('sucre', 98), ('fruc', 56), ('maman',65)]
d = dict(a)
arbre= [
    [
        'a',
        'bp',
        [78, 25, 453, 85, 96]
    ],
    [
        ['hi', ['no', ['ho', 'sucre', 3]], ['not', 'he', 20]],
        [['$', 'fruc', 7185], 'might', 'old'],
        'bye'
    ],
    [
        ['not', ['<', 'maman', 385]],
        [
            ['in', 'Age', 78.5],
            [['not', ['and', 'bp', 206]], 'life', [['or', ['not', ['\\', 'bp', 5]], ['p', 'sucre', 10]], 'ordag',[['perhaps', ['deal', 'maman', 79]],
            'helloo',[['or', ['pl', 'maman', 25]], 'come', 'go']]]],
            'noway'
        ],
        [['<', 'bp', 45], 'falseans', 'bye']
    ]
]

def replace(node):
    if isinstance(node, str):
        return d.get(node, node)
    elif isinstance(node, list):
        return [replace(el) for el in node]
    else:
        return node

replace(arbre)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X