Ich habe viel damit zu kämpfen, da ich ziemlich neu in Python und Scrapy bin. Angenommen, ich habe zwei Listen

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

Jetzt möchte ich ein Wörterbuch erstellen, in dem die Domäne der Werte mit der des Schlüssels übereinstimmt. Dies würde folgendermaßen aussehen:

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

Jede Hilfe, wie dies erreicht werden kann, wird von Jungs <3 geschätzt

1
ElmiiS 18 Apr. 2018 im 16:21

4 Antworten

Beste Antwort

Sie können ein Wörterbuchverständnis verwenden.

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

Beachten Sie, dass dies von Ihrer erwarteten Ausgabe abweicht, da der Wert für den Schlüssel "www.twitter.com" immer noch eine Liste ist.

Ich empfehle dringend, dass Sie für jeden Wert im Wörterbuch dieselbe Datenstruktur verwenden, auch wenn Sie am Ende Listen mit einzelnen Elementen haben. Auf diese Weise können Sie jedes Element von result.values() ohne Überraschungen durchlaufen (Zeichenfolgen sind selbst iterierbar) oder andere Operationen mit jedem Wert ausführen, ohne sich um ein TypeError kümmern zu müssen.

Beachten Sie auch, dass alle Wetten deaktiviert sind (da Ihre Frage nicht genau angegeben wäre), wenn Elemente mit "/" in a und möglicherweise mit überlappenden Präfixen vorhanden sein können.

2
timgeb 18 Apr. 2018 im 13:31

Bitte schön:

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)

Dies verwendet ein sogenanntes Diktatverständnis, das sowohl über a als auch über b iteriert.

0
Jan 18 Apr. 2018 im 13:26

Sie können ein Diktatverständnis und die str.startswith() -Methode verwenden, um dies zu erreichen:

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'}
1
bphi 18 Apr. 2018 im 13:23
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)
0
marc 18 Apr. 2018 im 13:25