0
votes

Diviser une liste d'URL avec un modèle similaire dans les dict

J'ai une liste d'URL qui ont un motif similaire comme celui-ci:

{"0008c5398": ['../abc/def/xyz/0008c5398-1.jpg',
 '../abc/def/xyz//0008c5398-2.jpg',
 '../abc/def/xyz//0008c5398-3.jpg',
 '../abc/def/xyz//0008c5398-4.jpg',
 '../abc/def/xyz//0008c5398-5.jpg'],
"000a290e4": [ '../abc/def/xyz//000a290e4-1.jpg',
 '../abc/def/xyz//000a290e4-2.jpg'],
"000fb9572": [ '../abc/def/xyz//000fb9572-1.jpg',
 '../abc/def/xyz//000fb9572-2.jpg',
 '../abc/def/xyz//000fb9572-3.jpg',
 '../abc/def/xyz//000fb9572-4.jpg']
}


0 commentaires

6 Réponses :


1
votes

Regardez dans des expressions régulières. Une approche serait de faire correspondre les URL contre une regex et de stocker les résultats dans un dictionnaire qui utilise un groupe numéroté dans la correspondance en tant que clé et ajoutez l'URL à la valeur:

import re


urls = ['../abc/def/xyz/0008c5398-1.jpg',
        '../abc/def/xyz//0008c5398-2.jpg',
        '../abc/def/xyz//0008c5398-3.jpg',
        '../abc/def/xyz//0008c5398-4.jpg',
        '../abc/def/xyz//0008c5398-5.jpg',
        '../abc/def/xyz//000a290e4-1.jpg',
        '../abc/def/xyz//000a290e4-2.jpg',
        '../abc/def/xyz//000fb9572-1.jpg',
        '../abc/def/xyz//000fb9572-2.jpg',
        '../abc/def/xyz//000fb9572-3.jpg',
        '../abc/def/xyz//000fb9572-4.jpg']


result = {}

rgx = re.compile(r"\.\./abc/def/xyz//(.*)-\d+.jpg")
for url in urls:
    match = rgx.search(url)
    if match:
        key = match.group(1)
        if key not in result:
            result[key] = []
        result[key] += [url]
    else:
        print(f'This did not match: {url}')


0 commentaires

1
votes

Vous pouvez utiliser itheroTools.groupby : xxx

sortie: xxx


0 commentaires

1
votes

Alternativement, vous pouvez également faire une division simple et obtenir le dernier élément de chaque URL pour obtenir le nom de l'image avant de séparer le nom pour obtenir l'ID d'image.

Après lequel vous pouvez vérifier si l'ID d'image existe dans Votre dictionnaire de résultat ou non et l'a annoncez à l'entrée du dictionnaire en conséquence. P>

    inputURLs = ['../abc/def/xyz/0008c5398-1.jpg',
                 '../abc/def/xyz//0008c5398-2.jpg',
                 '../abc/def/xyz//0008c5398-3.jpg',
                 '../abc/def/xyz//0008c5398-4.jpg',
                 '../abc/def/xyz//0008c5398-5.jpg',
                 '../abc/def/xyz//000a290e4-1.jpg',
                 '../abc/def/xyz//000a290e4-2.jpg',
                 '../abc/def/xyz//000fb9572-1.jpg',
                 '../abc/def/xyz//000fb9572-2.jpg',
                 '../abc/def/xyz//000fb9572-3.jpg',
                 '../abc/def/xyz//000fb9572-4.jpg']

    resultDict =  {}

    for inputUrl in inputURLs :
        imageName = inputUrl.split('/')[-1]
        imageId = imageName.split('-')[0]
        if imageId in resultDict :
            resultDict[imageId].append(inputUrl)
        else :
            resultDict[imageId] = [inputUrl]


0 commentaires

1
votes

Voici une solution simple d'itération de la liste et d'ajouter à un dictionnaire.

{'0008c5398': ['../abc/def/xyz/0008c5398-1.jpg',
               '../abc/def/xyz//0008c5398-2.jpg',
               '../abc/def/xyz//0008c5398-3.jpg',
               '../abc/def/xyz//0008c5398-4.jpg',
               '../abc/def/xyz//0008c5398-5.jpg'],
 '000a290e4': ['../abc/def/xyz//000a290e4-1.jpg',
               '../abc/def/xyz//000a290e4-2.jpg'],
 '000fb9572': ['../abc/def/xyz//000fb9572-1.jpg',
               '../abc/def/xyz//000fb9572-2.jpg',
               '../abc/def/xyz//000fb9572-3.jpg',
               '../abc/def/xyz//000fb9572-4.jpg']}


0 commentaires

1
votes

Vous pouvez continuer à ajouter les URL à un dict de listes à l'aide de dict.setdefault pour initialiser chaque nouvelle clé avec une liste (en supposant que votre liste d'URL est stockée comme l ): xxx

d devient: xxx


0 commentaires

1
votes

Tout d'abord au début, vous avez besoin d'une fonction pour obtenir la clé de vos articles. Vous pouvez utiliser re . xxx

et ensuite, vous avez besoin d'une boucle pour vérifier chaque article et faire la même chose que ci-dessus. et pour le rendre simple, vous pouvez utiliser defaultDict . xxx

Je ne sais pas si vous avez une erreur d'orthographe dans votre premier élément de vos échantillons de données . / DEF / XYZ / est différent avec les autres éléments, si vous ne pouvez pas simplement modifier le modèle re par supprimer le / de PAT comme vous avez besoin.


0 commentaires