我有一个具有类似模式的网址列表:
['../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']
}
有任何提示吗?提前非常感谢...
答案 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
模式。