【问题标题】:Create a dictionary from two lists having duplicate elements从具有重复元素的两个列表创建字典
【发布时间】:2018-09-20 09:05:41
【问题描述】:

从两个具有重复元素的列表创建一个字典,其中列表 1 是新字典的键,对于列表 2 中与列表 1 完全匹配的所有字符串,将其附加到列表 1 中键的值字段中。所以,例如:

{'assembla':['assemblabase', 'assemblauploading']}

像这样,我想要列表 1 中的每个元素

陷入这种逻辑:

new_d = {}
for j in list2:
    if j == list1 :
        new_d['j'].get('j') 
        print(new_d) 

清单 1:

list1 = ['assembla', 'bitbucket', 'cloudapp', 'cloudforge', 'cloudinary', 'concur', 'confluence', 'convo', 'dochub', 'docstoc', 'docusign', 'draw.io', 'dropbox', 'egnyte', 'evernote', 'facebook', 'flickr', 'github', 'gitlab', 'glassdoor', 'globalmeet', 'gotowebinar', 'hightail', 'hootsuite', 'huddle', 'icloud', 'imgur', 'instagram', 'issuu', 'jumpshare', 'linkedin', 'lucidpress', 'mail.ru', 'maytech', 'meetup', 'mega', 'mendeley', 'mixi', 'myspace', 'ning', 'onehub', 'owncloud', 'pastebin', 'pinterest', 'prezi', 'proofhub', 'quip', 'quora', 'readytalk', 'reddit', 'renren', 'screencast', 'scribd', 'sendthisfile', 'sharevault', 'slack', 'slideshare', 'smartsheet', 'soundcloud', 'sourceforge', 'stocktwits', 'storify', 'surveymonkey', 'syncplicity', 'tableau', 'teamdrive', 'teamviewer', 'trello', 'tumblr', 'twitter', 'viber', 'vimeo', 'vine', 'virustotal', 'workday', 'yammer', 'youtube', 'zendesk', 'zenefits']

清单 2:

list2 = ['2ch', '2chbase', '2chposting', '51.com', '51.commail', '51.combase', '51.combbs', '51.composting', '51.comwebdisk', '51.commusic', '51.comgames', 'adobeconnect', 'adobemeeting', 'adobemeetingdesktopsharing', 'adobemeetinguploading', 'adobemeetingfiletransfer', 'adobemeetingremotecontrol', 'adobeconnectnow', 'adobeconnectnowbase', 'adobeconnectnowfiletransfer', 'adobeconnectnowremotecontrol', 'adobecreativecloud', 'adobecreativecloudbase', 'adobecreativeclouduploading', 'aim', 'aimbase', 'aimvideo', 'aimaudio', 'aimfiletransfer', 'aimexpress', 'aimexpressbase', 'aimexpressfiletransfer', 'aliwangwang', 'aliwangwangbase', 'aliwangwangaudiovideo', 'aliwangwangfiletransfer', 'aliwangwangremotecontrol', 'amazonclouddrive', 'amazonclouddrivebase', 'amazonclouddriveuploading', 'amazonmusic', 'amazonmusicbase', 'amazonmusicstreaming', 'amebanow', 'amebanowbase', 'amebanowposting', 'assembla', 'assemblabase', 'assemblauploading', 'autodesk360', 'autodesk360base', 'autodesk360uploading', 'avayawebalive', 'avayawebalivebase', 'avayawebalivedesktopsharing', 'avayawebalivevoice', 'avayawebalivefiletransfer', 'bacnet', 'bacnetbase', 'bacnetackalarm', 'bacnetconfirmedcovnotify', 'bacnetconfirmedeventnotify', 'bacnetgetalarmsummary', 'bacnetgetenrollmentsummary', 'bacnetsubscribecov', 'bacnetatomicreadfile', 'bacnetatomicwritefile', 'bacnetaddlistelement', 'bacnetremovelistelement', 'bacnetcreateobject', 'bacnetdeleteobject', 'bacnetreadproperty', 'bacnetreadpropconditional', 'bacnetreadpropmultiple', 'bacnetwriteproperty', 'bacnetwritepropmultiple', 'bacnetdevicecommcontrol', 'bacnetconfirmedprivatexfer', 'bacnetconfirmedtextmessage', 'bacnetreinitializedevice', 'bacnetvtopen', 'bacnetvtclose', 'bacnetvtdata', 'bacnetauthenticate', 'bacnetrequestkey', 'bacnetreadrange', 'bacnetlifesafetyoperation', 'bacnetsubscribecovproperty', 'bacnetgeteventinformation', 'baiduhi', 'baiduhibase', 'baiduhiaudiovideo', 'baiduhifiletransfer', 'baiduhigames', 'bebo', 'bebomail', 'bebobase', 'beboposting', 'bitbucket', 'bitbucketbase', 'bitbucketuploading']

【问题讨论】:

    标签: python-3.x list dictionary dictionary-comprehension


    【解决方案1】:

    我相信这可以解决您的问题:

    new_dict = {}
    for i in list1:
        new_dict[i] = []
        for j in list2:
            if i in j:
                new_dict[i].append(j)
    

    【讨论】:

    • 对不起,输出应该是 {'assembla' : ['assemblabase', 'assemblauploading']} 所以匹配的元素不会在值字段中重复
    • 添加 if i in j and i!= j :现在可以正常工作了。非常感谢:)
    【解决方案2】:

    使用组合的 dict/list 理解(它更短,但可读性更差):

    new_dict = {key:[val for val in list2 if key in val and not key == val] for key in list1 if key in list2}
    

    在我的机器上,我得到以下输出:

    {'assembla': ['assemblabase', 'assemblauploading'], 'bitbucket': ['bitbucketbase', 'bitbucketuploading']}
    

    更新了您更准确的问题描述。刚刚在列表理解中添加了第二个条件。

    【讨论】:

    • 对不起,输出应该是 {'assembla' : ['assemblabase', 'assemblauploading']} 所以匹配的元素不会在值字段中重复
    • 非常感谢。这是一个非常大的理解:)
    • 不客气。如果您与其他开发人员一起工作,我建议您将其分解一下,因为乍一看并不容易理解。但是,如果这只是您使用的东西,请继续。
    【解决方案3】:

    使用 zip 创建 dict 输出到两个列表 a=[1,2] b=["a","b"] c=zip(a,b) c=dict(c)

    【讨论】:

    • 请在回答问题之前阅读整篇文章。这不会产生所需的输出。
    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多