我有一个具有类似模式的网址列表,如下所示:
['../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
模式。