2017-09-26 86 views
1

對不起,我要問這個問題,如果它是一個相當容易的,因爲時間有限這個script..I've已經這樣寫下面的一些代碼:如何通過使用python將多個列表合併爲多個字典?

localNames = re.findall(r"<\*\[local-name\(\)='.*?'.*?\/@\*\[name\(\)='.*?'.*?'\]", str(nontransTagsContent[0])) 
for i in localNames: 
tags = re.findall(r"local-name\(\)='(.*?)'", i) 
attributes = re.findall(r"name\(\)='(.*?)'", i) 

而對於print(tags)結果如下:

['tag1'] 
['tag2', 'tag3', 'tag4'] 
['tag5', 'tag6'] 

print(attributes)結果如下:

['attribute1', 'attribute2', 'attribute3', 'attribute4'] 
['attribute5', 'attribute6'] 
['attribute7', 'attribute8', 'attribute9'] 

我想要得到的結果是dictio中naries像:

{'tag1':['attribute1', 'attribute2', 'attribute3','attribute4'} 
{'tag2':['attribute5', 'attribute6']} 
{'tag3':['attribute5', 'attribute6']} 
{'tag4':['attribute5', 'attribute6']} 
{'tag5':['attribute7', 'attribute8', 'attribute9']} 
{'tag6':['attribute7', 'attribute8', 'attribute9']} 

我想用這種方式,我可以很容易地操縱數據,我可以提取數據,並寫入到其他形式。下面是我試過的代碼:

for x in tags: 
    dict = zip(tags, attributes) 
    print (list(dict)) 

但是輸出似乎並不正確。你會幫助看看它,看看如何解決這個問題......非常感謝!

+0

標籤和屬性*每行*是否保證是唯一的?換句話說,''attribute1''只會出現在line1嗎? –

+0

發佈您的'localNames'內容 – RomanPerekhrest

+0

這是個好問題。我認爲標籤應該是唯一的,但屬性可能不是。 – Penny

回答

2
tags=[ 
    ['tag1'], 
    ['tag2', 'tag3', 'tag4'], 
    ['tag5', 'tag6'], 
    ] 

    attributes=[ 
       ['attribute1', 'attribute2', 'attribute3', 'attribute4'], 
       ['attribute5', 'attribute6'], 
       ['attribute7', 'attribute8', 'attribute9'], 
      ] 

    for idx, tag_line in enumerate(tags): 
    for tag in tag_line: 
     print {tag : attributes[idx]} 

輸出:

{'tag1': ['attribute1', 'attribute2', 'attribute3', 'attribute4']} 
{'tag2': ['attribute5', 'attribute6']} 
{'tag3': ['attribute5', 'attribute6']} 
{'tag4': ['attribute5', 'attribute6']} 
{'tag5': ['attribute7', 'attribute8', 'attribute9']} 
{'tag6': ['attribute7', 'attribute8', 'attribute9']} 

如果你想dict有所有的標籤在一個列表

from itertools import repeat 
    for tag, attr in zip(tags,attributes): 
    print dict(zip(tag, repeat(attr,len(tag)))) 

輸出:

{'tag1': ['attribute1', 'attribute2', 'attribute3', 'attribute4']} 
{'tag4': ['attribute5', 'attribute6'], 'tag2': ['attribute5', 'attribute6'], 'tag3': ['attribute5', 'attribute6']} 
{'tag5': ['attribute7', 'attribute8', 'attribute9'], 'tag6': ['attribute7', 'attribute8', 'attribute9']} 

額外要求:

tags, attributes = [], [] 
for i in localNames: 
    tags.append(re.findall(r"local-name\(\)='(.*?)'", i)) 
    attributes.append(re.findall(r"name\(\)='(.*?)'", i)) 
+0

謝謝你的答案 - 我可以問我如何使標籤和屬性列表像你的例子?現在我得到的印刷標籤就像我在我的問題中展示的那樣.. – Penny

+0

@Penny看到我的更新 – galaxyan

+0

Hi @galaxyan嗨,非常感謝!這是非常有前途的!我嘗試了額外的請求代碼,發現如果我打印屬性,它會打印出幾個單獨的列表,最後一個列出所有內容,這就是我們需要/相同的例子。我試圖弄清楚如何只打印出我們現在需要的那個... – Penny

1

如果您明確創建字典,則可以更輕鬆,更清晰地完成此操作。 zip不會創建字典。

tags = [ 
    ['tag1'], 
    ['tag2', 'tag3', 'tag4'], 
    ['tag5', 'tag6'] 
] 

attributes = [ 
    ['attribute1', 'attribute2', 'attribute3', 'attribute4'], 
    ['attribute5', 'attribute6'], 
    ['attribute7', 'attribute8', 'attribute9'] 
] 

dict_list = [] 
for t_list, a_list in zip(tags, attributes): 
    for t in t_list: 
     dict_list.append({t: a_list}) 
     print(dict_list[-1]) 
+0

謝謝你的答案 - 我可以問我怎麼可以使標籤和屬性列表像你的例子?現在我得到的打印標籤就像我在我的問題中展示的那樣... – Penny

+0

在我的示例中,標籤和屬性存儲在名爲'dicts'的列表中。我會將其重命名爲「dict_list」,以便更清晰。 –

+0

謝謝你的回答!我明天會讀你的代碼! – Penny

0

您可以通過應用嵌套maps實現這一目標:

map(
    lambda x: map(
     lambda y: {y: attributes[x[0]]}, 
     x[1] 
    ), 
    enumerate(tags) 
) 
+0

我試過運行這個,它給了我'TypeError:()缺少1所需的位置參數:'x'' – Conic

+0

@Conic更新了答案。期待您對此解決方案的性能評估! –

+0

我試圖仔細地將這個改爲接受屬性,標籤並返回字典的函數。我注意到,我必須採取幾個步驟才能顯着改變性能評估。如果你不介意,你能找到一種方法將你的地圖變成字典嗎? – Conic

1

一個內膽:

guten_tag = { tag: attributes[i] for i, tag_group in enumerate(tags) for tag in tag_group} 

確保您有一個名爲tags列表和在另一種叫attributes像列表例子。

tags = [ 
    ['tag1'], 
    ['tag2', 'tag3', 'tag4'], 
    ['tag5', 'tag6'] 
] 

attributes = [ 
    ['attribute1', 'attribute2', 'attribute3', 'attribute4'], 
    ['attribute5', 'attribute6'], 
    ['attribute7', 'attribute8', 'attribute9'] 
] 

速度對比:

galaxy_an答案是1000000 loops1.05 µs per loop使用timeit模塊

jeremy答案是1000000 loops1.21 µs使用timeit模塊

guten_tag(THI S分析的)是在850 ns per loop1000000 loops使用timeit模塊

其中µs10^-6nano10^-9

在一個非常膚淺的層面上,這會使您的性能提高2-3個數量級。

相關問題