将具有类似模式的网址列表拆分为字典

时间:2019-03-26 03:28:30

标签: python python-3.x

我有一个具有类似模式的网址列表:

['../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/',类似于所有网址。我想将具有相似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']
}

有任何提示吗?提前非常感谢...

6 个答案:

答案 0 :(得分:1)

查看正则表达式。一种方法是将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}')

答案 1 :(得分:1)

您可以使用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"
   ]
}

答案 2 :(得分:1)

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

之后,您可以检查结果字典中是否存在图像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]

答案 3 :(得分:1)

这是一个简单的解决方案,只需遍历列表并附加到字典即可。

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

答案 4 :(得分:1)

您可以继续使用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']}

答案 5 :(得分:1)

首先,您需要一个函数来从您的物品中取出钥匙。您可以使用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/与其他项目不同,如果不确定,只需根据需要从re中删除/来更改pat模式。