我試圖將帶有冒號分隔元素的串列轉換為字典,但使用dict().
錯誤示例:
ValueError: dictionary update sequence element #0 has length 7; 2 is required
這是我嘗試轉換的串列的示例:
['inetnum:1.1.1.0-1.1.1.255', 'netname:APNIC-LABS', 'descr:APNICandCloudflareDNSResolverproject', 'descr:RoutedgloballybyAS13335/Cloudflare', 'descr:ResearchprefixforAPNICLabs', 'country:AU', 'org:ORG-ARAD1-AP', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'abuse-c:AA1412-AP', 'status:ASSIGNEDPORTABLE', 'remarks:---------------', 'remarks:AllCloudflareabusereportingcanbedonevia', 'remarks:<imgsrc="/eimg/f/5b/f5bbf78a66c792df55d04ee6bce9698d5c8accaf.png"alt="將不規則串列轉換為字典"loading="lazy">@cloudflare.com', 'remarks:---------------', 'mnt-by:APNIC-HM', 'mnt-routes:MAINT-AU-APNIC-GM85-AP', 'mnt-irt:IRT-APNICRANDNET-AU', 'last-modified:2020-07-15T13:10:57Z', 'source:APNIC', '', 'irt:IRT-APNICRANDNET-AU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'auth:#Filtered', 'remarks:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.netwasvalidatedon2021-02-09', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2021-03-09T01:10:21Z', 'source:APNIC', '', 'organisation:ORG-ARAD1-AP', 'org-name:APNICResearchandDevelopment', 'country:AU', 'address:6CordeliaSt', 'phone: 61-7-38583100', 'fax-no: 61-7-38583199', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-ref:APNIC-HM', 'mnt-by:APNIC-HM', 'last-modified:2017-10-11T01:28:39Z', 'source:APNIC', '', 'role:ABUSEAPNICRANDNETAU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:ZZ', 'phone: 000000000', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'nic-hdl:AA1412-AP', 'remarks:GeneratedfromirtobjectIRT-APNICRANDNET-AU', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-by:APNIC-ABUSE', 'last-modified:2021-03-09T01:10:22Z', 'source:APNIC', '', 'role:APNICRESEARCH', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:AU', 'phone: 61-7-3858-3188', 'fax-no: 61-7-3858-3199', 'e-mail:<imgsrc="/eimg/a/4a/a4a58e14449e98257260341784a655af43ebbb08.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'nic-hdl:AR302-AP', 'tech-c:AH256-AP', 'admin-c:AH256-AP', 'mnt-by:MAINT-APNIC-AP', 'last-modified:2018-04-04T04:26:04Z', 'source:APNIC', '', '', '', 'route:1.1.1.0/24', 'origin:AS13335', 'descr:APNICResearchandDevelopment', '6CordeliaSt', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2018-03-16T16:58:06Z', 'source:APNIC', '']
我想得到類似的東西:
{"inetnum":"1.1.1.0-1.1.1.255", "netname":"APNIC-LABS"}
我能做些什么?
uj5u.com熱心網友回復:
使用常規for回圈以提高可讀性。用于str.split拆分:為最多 2 個元素。跳過沒有:找到的字串。
lst = ['inetnum:1.1.1.0-1.1.1.255', 'netname:APNIC-LABS', 'descr:APNICandCloudflareDNSResolverproject', 'descr:RoutedgloballybyAS13335/Cloudflare', 'descr:ResearchprefixforAPNICLabs', 'country:AU', 'org:ORG-ARAD1-AP', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'abuse-c:AA1412-AP', 'status:ASSIGNEDPORTABLE', 'remarks:---------------', 'remarks:AllCloudflareabusereportingcanbedonevia', 'remarks:<imgsrc="/eimg/f/5b/f5bbf78a66c792df55d04ee6bce9698d5c8accaf.png"alt="將不規則串列轉換為字典"loading="lazy">@cloudflare.com', 'remarks:---------------', 'mnt-by:APNIC-HM', 'mnt-routes:MAINT-AU-APNIC-GM85-AP', 'mnt-irt:IRT-APNICRANDNET-AU', 'last-modified:2020-07-15T13:10:57Z', 'source:APNIC', '', 'irt:IRT-APNICRANDNET-AU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'auth:#Filtered', 'remarks:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.netwasvalidatedon2021-02-09', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2021-03-09T01:10:21Z', 'source:APNIC', '', 'organisation:ORG-ARAD1-AP', 'org-name:APNICResearchandDevelopment', 'country:AU', 'address:6CordeliaSt', 'phone: 61-7-38583100', 'fax-no: 61-7-38583199', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-ref:APNIC-HM', 'mnt-by:APNIC-HM', 'last-modified:2017-10-11T01:28:39Z', 'source:APNIC', '', 'role:ABUSEAPNICRANDNETAU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:ZZ', 'phone: 000000000', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'nic-hdl:AA1412-AP', 'remarks:GeneratedfromirtobjectIRT-APNICRANDNET-AU', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-by:APNIC-ABUSE', 'last-modified:2021-03-09T01:10:22Z', 'source:APNIC', '', 'role:APNICRESEARCH', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:AU', 'phone: 61-7-3858-3188', 'fax-no: 61-7-3858-3199', 'e-mail:<imgsrc="/eimg/a/4a/a4a58e14449e98257260341784a655af43ebbb08.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'nic-hdl:AR302-AP', 'tech-c:AH256-AP', 'admin-c:AH256-AP', 'mnt-by:MAINT-APNIC-AP', 'last-modified:2018-04-04T04:26:04Z', 'source:APNIC', '', '', '', 'route:1.1.1.0/24', 'origin:AS13335', 'descr:APNICResearchandDevelopment', '6CordeliaSt', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2018-03-16T16:58:06Z', 'source:APNIC', '']
dct = {}
for s in lst:
tup = s.split(':', maxsplit=1)
if len(tup) < 2:
continue
else:
dct[tup[0]] = tup[1]
print(dct)
# {'inetnum': '1.1.1.0-1.1.1.255', 'netname': 'APNIC-LABS', 'descr': 'APNICResearchandDevelopment', 'country': 'AU', 'org': 'ORG-ARAD1-AP', 'admin-c': 'AH256-AP', 'tech-c': 'AH256-AP', 'abuse-c': 'AA1412-AP', 'status': 'ASSIGNEDPORTABLE', 'remarks': 'GeneratedfromirtobjectIRT-APNICRANDNET-AU', 'mnt-by': 'MAINT-AU-APNIC-GM85-AP', 'mnt-routes': 'MAINT-AU-APNIC-GM85-AP', 'mnt-irt': 'IRT-APNICRANDNET-AU', 'last-modified': '2018-03-16T16:58:06Z', 'source': 'APNIC', 'irt': 'IRT-APNICRANDNET-AU', 'address': 'Australia', 'e-mail': '<imgsrc="/eimg/a/4a/a4a58e14449e98257260341784a655af43ebbb08.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'abuse-mailbox': '<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'auth': '#Filtered', 'organisation': 'ORG-ARAD1-AP', 'org-name': 'APNICResearchandDevelopment', 'phone': ' 61-7-3858-3188', 'fax-no': ' 61-7-3858-3199', 'mnt-ref': 'APNIC-HM', 'role': 'APNICRESEARCH', 'nic-hdl': 'AR302-AP', 'route': '1.1.1.0/24', 'origin': 'AS13335'}
uj5u.com熱心網友回復:
如果您只想忽略不遵循key:value格式的串列元素,請過濾到僅包含一個冒號的串列元素:
>>> data = ['inetnum:1.1.1.0-1.1.1.255', 'netname:APNIC-LABS', 'descr:APNICandCloudflareDNSResolverproject', 'descr:RoutedgloballybyAS13335/Cloudflare', 'descr:ResearchprefixforAPNICLabs', 'country:AU', 'org:ORG-ARAD1-AP', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'abuse-c:AA1412-AP', 'status:ASSIGNEDPORTABLE', 'remarks:---------------', 'remarks:AllCloudflareabusereportingcanbedonevia', 'remarks:<imgsrc="/eimg/f/5b/f5bbf78a66c792df55d04ee6bce9698d5c8accaf.png"alt="將不規則串列轉換為字典"loading="lazy">@cloudflare.com', 'remarks:---------------', 'mnt-by:APNIC-HM', 'mnt-routes:MAINT-AU-APNIC-GM85-AP', 'mnt-irt:IRT-APNICRANDNET-AU', 'last-modified:2020-07-15T13:10:57Z', 'source:APNIC', '', 'irt:IRT-APNICRANDNET-AU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'auth:#Filtered', 'remarks:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.netwasvalidatedon2021-02-09', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2021-03-09T01:10:21Z', 'source:APNIC', '', 'organisation:ORG-ARAD1-AP', 'org-name:APNICResearchandDevelopment', 'country:AU', 'address:6CordeliaSt', 'phone: 61-7-38583100', 'fax-no: 61-7-38583199', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-ref:APNIC-HM', 'mnt-by:APNIC-HM', 'last-modified:2017-10-11T01:28:39Z', 'source:APNIC', '', 'role:ABUSEAPNICRANDNETAU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:ZZ', 'phone: 000000000', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'nic-hdl:AA1412-AP', 'remarks:GeneratedfromirtobjectIRT-APNICRANDNET-AU', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-by:APNIC-ABUSE', 'last-modified:2021-03-09T01:10:22Z', 'source:APNIC', '', 'role:APNICRESEARCH', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:AU', 'phone: 61-7-3858-3188', 'fax-no: 61-7-3858-3199', 'e-mail:<imgsrc="/eimg/a/4a/a4a58e14449e98257260341784a655af43ebbb08.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'nic-hdl:AR302-AP', 'tech-c:AH256-AP', 'admin-c:AH256-AP', 'mnt-by:MAINT-APNIC-AP', 'last-modified:2018-04-04T04:26:04Z', 'source:APNIC', '', '', '', 'route:1.1.1.0/24', 'origin:AS13335', 'descr:APNICResearchandDevelopment', '6CordeliaSt', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2018-03-16T16:58:06Z', 'source:APNIC', '']
>>> dict(i.split(":") for i in data if i.count(":") == 1)
{'inetnum': '1.1.1.0-1.1.1.255', 'netname': 'APNIC-LABS', 'descr': 'APNICResearchandDevelopment', 'country': 'AU', 'org': 'ORG-ARAD1-AP', 'admin-c': 'AH256-AP', 'tech-c': 'AH256-AP', 'abuse-c': 'AA1412-AP', 'status': 'ASSIGNEDPORTABLE', 'remarks': 'GeneratedfromirtobjectIRT-APNICRANDNET-AU', 'mnt-by': 'MAINT-AU-APNIC-GM85-AP', 'mnt-routes': 'MAINT-AU-APNIC-GM85-AP', 'mnt-irt': 'IRT-APNICRANDNET-AU', 'source': 'APNIC', 'irt': 'IRT-APNICRANDNET-AU', 'address': 'Australia', 'e-mail': '<imgsrc="/eimg/a/4a/a4a58e14449e98257260341784a655af43ebbb08.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'abuse-mailbox': '<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'auth': '#Filtered', 'organisation': 'ORG-ARAD1-AP', 'org-name': 'APNICResearchandDevelopment', 'phone': ' 61-7-3858-3188', 'fax-no': ' 61-7-3858-3199', 'mnt-ref': 'APNIC-HM', 'role': 'APNICRESEARCH', 'nic-hdl': 'AR302-AP', 'route': '1.1.1.0/24', 'origin': 'AS13335'}
如果沒有那個if i.count(":") == 1過濾器,你會在一些字串上得到錯誤,因為它們中的一些是空的(因此它們在拆分時的長度為 0)并且至少一個有三個:s(因此它的長度為 4)。
請注意,此解決方案只是忽略這些條目,而不是試圖理解它們或引發錯誤。如果您想對 3-:條目執行其他操作(例如將它們拆分為兩個鍵值對,或允許鍵和/或值包含:字符),您需要確定一種方法并修改鍵:值序列已構建。
uj5u.com熱心網友回復:
@Samwise 已經證明使用生成器作為dict()建構式的輸入效果很好
這是一個簡單的回圈,可能更容易理解:
list_ = ['inetnum:1.1.1.0-1.1.1.255', 'netname:APNIC-LABS', 'descr:APNICandCloudflareDNSResolverproject', 'descr:RoutedgloballybyAS13335/Cloudflare', 'descr:ResearchprefixforAPNICLabs', 'country:AU', 'org:ORG-ARAD1-AP', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'abuse-c:AA1412-AP', 'status:ASSIGNEDPORTABLE', 'remarks:---------------', 'remarks:AllCloudflareabusereportingcanbedonevia', 'remarks:<imgsrc="/eimg/f/5b/f5bbf78a66c792df55d04ee6bce9698d5c8accaf.png"alt="將不規則串列轉換為字典"loading="lazy">@cloudflare.com', 'remarks:---------------', 'mnt-by:APNIC-HM', 'mnt-routes:MAINT-AU-APNIC-GM85-AP', 'mnt-irt:IRT-APNICRANDNET-AU', 'last-modified:2020-07-15T13:10:57Z', 'source:APNIC', '', 'irt:IRT-APNICRANDNET-AU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'auth:#Filtered', 'remarks:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.netwasvalidatedon2021-02-09', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2021-03-09T01:10:21Z', 'source:APNIC', '', 'organisation:ORG-ARAD1-AP', 'org-name:APNICResearchandDevelopment', 'country:AU', 'address:6CordeliaSt', 'phone: 61-7-38583100', 'fax-no: 61-7-38583199', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-ref:APNIC-HM', 'mnt-by:APNIC-HM', 'last-modified:2017-10-11T01:28:39Z', 'source:APNIC', '', 'role:ABUSEAPNICRANDNETAU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:ZZ', 'phone: 000000000', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'nic-hdl:AA1412-AP', 'remarks:GeneratedfromirtobjectIRT-APNICRANDNET-AU', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-by:APNIC-ABUSE', 'last-modified:2021-03-09T01:10:22Z', 'source:APNIC', '', 'role:APNICRESEARCH', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:AU', 'phone: 61-7-3858-3188', 'fax-no: 61-7-3858-3199', 'e-mail:<imgsrc="/eimg/a/4a/a4a58e14449e98257260341784a655af43ebbb08.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'nic-hdl:AR302-AP', 'tech-c:AH256-AP', 'admin-c:AH256-AP', 'mnt-by:MAINT-APNIC-AP', 'last-modified:2018-04-04T04:26:04Z', 'source:APNIC', '', '', '', 'route:1.1.1.0/24', 'origin:AS13335', 'descr:APNICResearchandDevelopment', '6CordeliaSt', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2018-03-16T16:58:06Z', 'source:APNIC', '']
dict_ = {}
for e in list_:
k, *v = e.split(':', 1)
if v:
dict_[k] = v[0]
uj5u.com熱心網友回復:
使用spliton 方法:將串列中的字串分隔為 dict 的鍵值對。
res = {}
data = ['inetnum:1.1.1.0-1.1.1.255', 'netname:APNIC-LABS', 'descr:APNICandCloudflareDNSResolverproject', 'descr:RoutedgloballybyAS13335/Cloudflare', 'descr:ResearchprefixforAPNICLabs', 'country:AU', 'org:ORG-ARAD1-AP', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'abuse-c:AA1412-AP', 'status:ASSIGNEDPORTABLE', 'remarks:---------------', 'remarks:AllCloudflareabusereportingcanbedonevia', 'remarks:<imgsrc="/eimg/f/5b/f5bbf78a66c792df55d04ee6bce9698d5c8accaf.png"alt="將不規則串列轉換為字典"loading="lazy">@cloudflare.com', 'remarks:---------------', 'mnt-by:APNIC-HM', 'mnt-routes:MAINT-AU-APNIC-GM85-AP', 'mnt-irt:IRT-APNICRANDNET-AU', 'last-modified:2020-07-15T13:10:57Z', 'source:APNIC', '', 'irt:IRT-APNICRANDNET-AU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'auth:#Filtered', 'remarks:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.netwasvalidatedon2021-02-09', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2021-03-09T01:10:21Z', 'source:APNIC', '', 'organisation:ORG-ARAD1-AP', 'org-name:APNICResearchandDevelopment', 'country:AU', 'address:6CordeliaSt', 'phone: 61-7-38583100', 'fax-no: 61-7-38583199', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-ref:APNIC-HM', 'mnt-by:APNIC-HM', 'last-modified:2017-10-11T01:28:39Z', 'source:APNIC', '', 'role:ABUSEAPNICRANDNETAU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:ZZ', 'phone: 000000000', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'nic-hdl:AA1412-AP', 'remarks:GeneratedfromirtobjectIRT-APNICRANDNET-AU', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-by:APNIC-ABUSE', 'last-modified:2021-03-09T01:10:22Z', 'source:APNIC', '', 'role:APNICRESEARCH', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:AU', 'phone: 61-7-3858-3188', 'fax-no: 61-7-3858-3199', 'e-mail:<imgsrc="/eimg/a/4a/a4a58e14449e98257260341784a655af43ebbb08.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'nic-hdl:AR302-AP', 'tech-c:AH256-AP', 'admin-c:AH256-AP', 'mnt-by:MAINT-APNIC-AP', 'last-modified:2018-04-04T04:26:04Z', 'source:APNIC', '', '', '', 'route:1.1.1.0/24', 'origin:AS13335', 'descr:APNICResearchandDevelopment', '6CordeliaSt', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2018-03-16T16:58:06Z', 'source:APNIC', '']
for entry in data:
try:
k, v = entry.split(':')
res[k] = v
except ValueError:
pass
print(res)
值得注意的是,您有一個'6CordeliaSt'既不是用冒號分隔的條目,也不是空白字串。進一步調整代碼將取決于您是否要保留或忽略此條目(上面的代碼將忽略它)。
我還注意到您有幾個以 開頭的條目'remarks',因此上面的代碼將只保留最后一個。一個更復雜的解決方案是將串列保留為每個字典鍵的值并附加到它,就像這樣
for entry in data:
try:
k, v = entry.split(':')
if k in res.keys():
res[k].append(v)
else:
res[k] = [v]
except ValueError:
pass
print(res)
這仍然會忽略沒有像 6CordeliaSt 這樣在冒號上拆分的字串,但它會將所有以相同鍵開頭的值保持在一起,例如remarks,但是您的“更簡單”條目將需要通過串列訪問
{
"inetnum": ["1.1.1.0-1.1.1.255"],
"netname": ["APNIC-LABS"],
"remarks": ['---------------', 'AllCloudflareabusereportingcanbedonevia', '<imgsrc="/eimg/f/5b/f5bbf78a66c792df55d04ee6bce9698d5c8accaf.png"alt="將不規則串列轉換為字典"loading="lazy">@cloudflare.com', '---------------', '<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.netwasvalidatedon2021-02-09', 'GeneratedfromirtobjectIRT-APNICRANDNET-AU']
}
uj5u.com熱心網友回復:
一個解決方案:
- 不丟棄帶有多個冒號的條目(將第一個冒號之后的所有冒號視為值的一部分)
- 可以很容易地調整以選擇如何處理不帶冒號的條目,而不需要例外處理(這會使理解不起作用)
為了避免(較慢的)內部基因expr,它map與預先構建的磁區器一起使用:
# At top of file
from operator import methodcaller # Efficient means of invoking .partition(':') on each item
PART_COLON= methodcaller('partition', ':')
# At point of use:
mylist = ['inetnum:1.1.1.0-1.1.1.255', 'netname:APNIC-LABS', 'descr:APNICandCloudflareDNSResolverproject', 'descr:RoutedgloballybyAS13335/Cloudflare', 'descr:ResearchprefixforAPNICLabs', 'country:AU', 'org:ORG-ARAD1-AP', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'abuse-c:AA1412-AP', 'status:ASSIGNEDPORTABLE', 'remarks:---------------', 'remarks:AllCloudflareabusereportingcanbedonevia', 'remarks:<imgsrc="/eimg/f/5b/f5bbf78a66c792df55d04ee6bce9698d5c8accaf.png"alt="將不規則串列轉換為字典"loading="lazy">@cloudflare.com', 'remarks:---------------', 'mnt-by:APNIC-HM', 'mnt-routes:MAINT-AU-APNIC-GM85-AP', 'mnt-irt:IRT-APNICRANDNET-AU', 'last-modified:2020-07-15T13:10:57Z', 'source:APNIC', '', 'irt:IRT-APNICRANDNET-AU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'auth:#Filtered', 'remarks:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.netwasvalidatedon2021-02-09', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2021-03-09T01:10:21Z', 'source:APNIC', '', 'organisation:ORG-ARAD1-AP', 'org-name:APNICResearchandDevelopment', 'country:AU', 'address:6CordeliaSt', 'phone: 61-7-38583100', 'fax-no: 61-7-38583199', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-ref:APNIC-HM', 'mnt-by:APNIC-HM', 'last-modified:2017-10-11T01:28:39Z', 'source:APNIC', '', 'role:ABUSEAPNICRANDNETAU', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:ZZ', 'phone: 000000000', 'e-mail:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'admin-c:AR302-AP', 'tech-c:AR302-AP', 'nic-hdl:AA1412-AP', 'remarks:GeneratedfromirtobjectIRT-APNICRANDNET-AU', 'abuse-mailbox:<imgsrc="/eimg/b/11/b116938aa3180504ab727885fc8426ee57dbb10b.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'mnt-by:APNIC-ABUSE', 'last-modified:2021-03-09T01:10:22Z', 'source:APNIC', '', 'role:APNICRESEARCH', 'address:POBox3646', 'address:SouthBrisbane,QLD4101', 'address:Australia', 'country:AU', 'phone: 61-7-3858-3188', 'fax-no: 61-7-3858-3199', 'e-mail:<imgsrc="/eimg/a/4a/a4a58e14449e98257260341784a655af43ebbb08.png"alt="將不規則串列轉換為字典"loading="lazy">@apnic.net', 'nic-hdl:AR302-AP', 'tech-c:AH256-AP', 'admin-c:AH256-AP', 'mnt-by:MAINT-APNIC-AP', 'last-modified:2018-04-04T04:26:04Z', 'source:APNIC', '', '', '', 'route:1.1.1.0/24', 'origin:AS13335', 'descr:APNICResearchandDevelopment', '6CordeliaSt', 'mnt-by:MAINT-AU-APNIC-GM85-AP', 'last-modified:2018-03-16T16:58:06Z', 'source:APNIC', '']
mydict = {k: v for k, _, v in map(PART_COLON, mylist) if k}
在線嘗試!
如所寫,這只丟棄帶有空鍵的條目(當字串為空或以 a 開頭時發生:),同時保留沒有值的鍵(因為它們以:字串中的 only 結尾或沒有:)。不過,調整行為是微不足道的:
- 丟棄帶有空鍵或根本沒有冒號的輸入:
mydict = {k: v for k, sep, v in map(PART_COLON, mylist) if k and sep} - 丟棄帶有空鍵或值的輸入(即使它們以冒號結尾):
mydict = {k: v for k, _, v in map(PART_COLON, mylist) if k and v} - 丟棄不帶冒號的條目,但如果冒號后沒有資料,則存盤
None而不是空字串:mydict = {k: (v or None) for k, sep, v in map(PART_COLON, mylist) if k and sep}
等你總是在第一個冒號之前有任何東西k(只有當字串以 開頭時才為空,如果字串中沒有出現:則包含整個字串), (或者當我忽略它時)將是(在字串中至少有一個冒號)或(字串中沒有冒號),并且將是第一個冒號之后的所有剩余資料(如果存在),當沒有冒號時為空(或者冒號是字串中的最后一個字符) ; 您根據空/非空來區分案例)。:sep_':'''vsep
它高效(map將內部磁區回圈完全移動到 C 層,外部dict理解在位元組碼解釋器中特別優化)、緊湊、無例外(輸入必須是 的可迭代物件str,但strs 的值不會導致解包失敗,就像.split(':')逗號的數量從 0 到 n 可變時那樣)并且非常可配置(如圖所示,只需對過濾條件進行微小的調整即可完成大部分作業,可能需要調整輸出運算式以替換某些值,例如帶 . 的空字串None。
uj5u.com熱心網友回復:
例如你可以試試這個代碼請我的兄弟
list =['inetnum:1.1.1.0-1.1.1.255', 'netname:APNIC-LABS','']
d = {}
for x in list :
if ':' in x :
d[x.split(":", 1)[0]] = x.split(":", 1)[1]
print(d)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485515.html
標籤:Python python-3.x 字典
