Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用两个列表中的多个值创建dict_Python_Scrapy_Splash Screen - Fatal编程技术网

Python 使用两个列表中的多个值创建dict

Python 使用两个列表中的多个值创建dict,python,scrapy,splash-screen,Python,Scrapy,Splash Screen,我一直在努力解决这个问题,因为我对python和scrapy还很陌生。 假设我有两张清单 a = ['www.google.com', 'www.facebook.com', 'www.twitter.com'] b = ['www.google.com/adsense/', 'www.twitter.com/login', 'www.facebook.com/user/xx', 'www.facebook.com/user/yy', 'www.google.com/adwords'] 现在我

我一直在努力解决这个问题,因为我对python和scrapy还很陌生。 假设我有两张清单

a = ['www.google.com', 'www.facebook.com', 'www.twitter.com']
b = ['www.google.com/adsense/', 'www.twitter.com/login', 'www.facebook.com/user/xx', 'www.facebook.com/user/yy', 'www.google.com/adwords']
现在我想创建一个字典,其中值的域与键的域匹配,如下所示:

c = {'www.google.com':['www.google.com/adsense/', 'www.google.com/adwords'], 'www.facebook.com':['www.facebook.com/user/xx', 'www.facebook.com/user/yy'], 'www.twitter.com':'www.twitter.com/login'}

任何关于如何实现这一点的帮助都是非常感谢的。您可以使用dict理解和
str.startswith()
方法来实现这一点:

domains = ['www.google.com', 'www.facebook.com', 'www.twitter.com']
urls = ['www.google.com/adsense/', 'www.google.com/adwords', 
        'www.twitter.com/login', 'www.facebook.com/user/xx', 
        'www.facebook.com/user/yy']

c = {domain: [url for url in urls if url.startswith(domain)] for domain in domains}
>>> c
>>> {'www.google.com':['www.google.com/adsense/', 'www.google.com/adwords'], 
     'www.facebook.com':['www.facebook.com/user/xx', 'www.facebook.com/user/yy'], 
     'www.twitter.com':'www.twitter.com/login'}

你可以用字典来理解

>>> {k:[x for x in b if x.split('/', 1)[0] == k] for k in a}
{'www.facebook.com': ['www.facebook.com/user/xx', 'www.facebook.com/user/yy'], 'www.twitter.com': ['www.twitter.com/login'], 'www.google.com': ['www.google.com/adsense/', 'www.google.com/adwords']}
请注意,这与预期的输出不同,因为键
“www.twitter.com”
的值仍然是一个列表

我强烈建议您对字典中的每个值都使用相同的数据结构,即使最终使用的是单个元素列表。通过这种方式,您可以毫无意外地迭代
result.values()
的每个元素(字符串本身就是可编辑的),或者对每个值执行其他操作,而不必担心
类型错误

另外请注意,如果
a
中可能有
“/”
的元素,并且可能有重叠的前缀,则所有下注都是无效的(因为您的问题没有明确说明)

a = ['www.google.com', 'www.facebook.com', 'www.twitter.com']
b = ['www.google.com/adsense/', 'www.twitter.com/login', 'www.facebook.com/user/xx', 'www.facebook.com/user/yy', 'www.google.com/adwords']

myDict = {}
for domain in a:
    myDict[domain] = []
    for link in b:
        if domain in link:
            myDict[domain].append(link)
a = ['www.google.com', 'www.facebook.com', 'www.twitter.com']
b = ['www.google.com/adsense/', 'www.twitter.com/login', 'www.facebook.com/user/xx', 'www.facebook.com/user/yy', 'www.google.com/adwords']

c = {key: [value for value in b if value.startswith(key)] for key in a}
print(c)

这使用了一种所谓的dict理解,它对
a
b
进行迭代,我认为
str.split
str.startswith
相比,在前缀重叠的情况下,它更为健壮。这就是我为什么使用str.split
.Thx的原因!为什么你认为str.split更健壮?是否有一个Struts StaspIt会失败的案例?这是真的,它可能更健壮。请考虑域是<代码> www. GooGo.com /< /COD>的情况。拆分方法将失败。@bphi是的,我不认为OP正在考虑这种情况。我刚刚添加了一个编辑,在那里我解释说,关于
a
中哪些可以和哪些不可以,这个问题太不明确了。谢谢!我使用urlparse().netloc来“清理”域中的所有值,因此在域的末尾应该没有/。