[英]trying to save data from a list in a dictionary (in a more pythonic way)
[英]More pythonic way to pick multiple element types from tagged data
我有一些使用lxml處理的標記數據。 當我打開文件時,我不知道在打開文件之前是否具有三種類型的元素中的一種或多種(我可以具有一種,兩種或三種不同的元素以及我擁有的任何類型的多個實例)
我需要一些有關這些元素的信息,這些信息包含在元素的子標記中
<element_type_1>
<name>joe smith</name>
</element_type_1>
<element_type_2>
<name>mary smith</name>
</element_type_2>
<element_type_3>
<name>patrick smith</name>
</element_type_3>
因此,在這種情況下,我擁有所有三種類型,但是每種類型只有一種,但是任何類型都可以有任意多個任意數量的數字。
我通過在函數中使用cssselect
3次獲取元素
def get_types(myTree):
type_dict=defaultdict(list)
type_dict['type_1']=myTree.cssselect('element_type_1')
type_dict['type_2']=myTree.cssselect('element_type_2')
type_dict['type_3']=myTree.cssselect('element_type_3')
ret type_dict
這似乎過於多余
我是否缺少可以解決此問題的內容?
僅供參考,我這樣做是因為對於每種類型,我都必須匹配相關文檔中的其他一些數據
早期的答案表明我需要澄清一下-我想避免穿過樹三遍
您可以這樣做:
for i in range(1, 4):
type_dict['type_%d' % i] = myTree.cssselect('element_type_%d' % i)
取決於您是否了解外觀。 使用變量作為鍵可能會很容易,可以幫助您進行一點點的改進。
def get_types(myTree):
type_dict=defaultdict(list)
for i in range(1,4):
x = 'type_%d' % i
y = 'element_type_%d' % i
type_dict[x] = myTree.csselect(y)
return type_dict
如果您事先不知道它們的名稱,我將不知道如何識別這些“類型”。 它們遵循您可以搜索的固定模式嗎?
例如,您可以執行以下操作:
d = {}
typeelements = "*[starts-with(local-name(), 'element_type_')]"
for e in myTree.xpath(typeelements)
typename = e.tag.split('_',1)[1]
d[typename] = e
或更簡潔地說:
d = {e.tag.split('_',1)[1]:e for e in myTree.xpath(typeelements)}
或者,您可以根據元素本身中的某些條件選擇元素。 在您的示例中,它們都具有子name
,因此您可以使用以下路徑:
typeelements = '*[name]'
或者,您可以結合兩個要求:
typeelements = "*[starts-with(name(), 'element_type_')][name]"
或者,您可以遍歷一組已知標簽以尋找匹配的元素。 找到元素后,將(tag,value)添加到dict。 應該工作正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.