将具有相似模式的 url 列表拆分为字典



我有一个具有类似模式的网址列表,如下所示:

['../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']

第一部分类似'../abc/def/xyz/' 类似于所有 URL。我想将具有相似ID的链接分组为字典,如下所示:

{"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']
}

有什么提示吗?提前非常感谢...

这是一个简单的解决方案,只需迭代列表并附加到字典中。

import os
import pprint
a = ['../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']
url_dict = {}
for url in a:
    id = os.path.split(url)[-1].split('-')[0]
    if id not in url_dict.keys():
       url_dict[id] = [url]
    else:
        url_dict[id].append(url)
pprint.pprint(url_dict)

输出:

{'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']}

查看正则表达式。一种方法是将 URL 与正则表达式进行匹配,并将结果存储在字典中,该字典使用匹配中的编号组作为键,并将 URL 添加到值中:

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}')
您可以使用

itertools.groupby

import re
from itertools import groupby
d = ['../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']
_d = [[re.findall('w+(?=-d)', i)[0], i] for i in d]
result = {a:[c for _, c in b] for a,b in groupby(sorted(_d, key=lambda x:x[0]), key=lambda x:x[0])}

输出:

{
 "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"
   ]
}

或者,您也可以执行简单的拆分并获取每个 URL 的最后一项以获取图像名称,然后再再次拆分名称以获取图像 ID。

之后,您可以检查结果字典中是否存在图像 ID,并将其相应地附加到字典条目中。

    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]
<</div> div class="one_answers">

您可以使用 dict.setdefault 将 URL 附加到列表字典中,以使用列表初始化每个新键(假设您的 URL 列表存储为 l(:

d = {}
for i in l:
    d.setdefault(i.split('/')[-1].split('-')[0], []).append(i)

d变成:

{'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']}

首先,您需要一个函数来从项目中取出密钥。 您可以使用re .

In [106]: import re                                                                                                                                                                                                                                                             
In [107]: pat = r'.*?xyz//(.*)-.*'                                                                                                                                                                                                                                              
In [108]: match = re.search(pat, '../abc/def/xyz//0008c5398-4.jpg')                                                                                                                                                                                                             
In [109]: match.group(1)                                                                                                                                                                                                                                                        
Out[109]: '0008c5398'

然后,你需要一个循环来检查每个项目,并做与上面相同的事情。 为了简单起见,您可以使用 defaultdict .

In [110]: from collections import defaultdict                                                                                                                                                                                                                                   
In [111]: d = defaultdict(set)   
In [119]: for i in sample: 
     ...:     pat = r'.*?xyz//(.*)-.*' 
     ...:     match = re.search(pat, i) 
     ...:     if not match: 
     ...:         continue 
     ...:     key = match.group(1) 
     ...:     d[key].add(i) 
     ...:      
     ...:                                                                                                                                                                                                                                                                       
In [120]: d                                                                                                                                                                                                                                                                     
Out[120]: 
defaultdict(set,
            {'0008c5398': {'../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'}})

我不确定您在示例数据的第一项中是否有拼写错误。 /def/xyz/与其他项目不同,如果您不确定,只需根据需要从pat中删除/来更改re模式。

最新更新