Python 如何通过公共值将数组链接到另一个数组
我使用lxml通过Python中的纯文本数据创建了一个XML文档,但在将一个数组与另一个具有一个公共值的数组链接时遇到了问题。一个数组称为升级,另一个数组称为TotalAmount XML中的desire结构如下所示:Python 如何通过公共值将数组链接到另一个数组,python,arrays,lxml,Python,Arrays,Lxml,我使用lxml通过Python中的纯文本数据创建了一个XML文档,但在将一个数组与另一个具有一个公共值的数组链接时遇到了问题。一个数组称为升级,另一个数组称为TotalAmount XML中的desire结构如下所示: <Header> <Promotion> <PromotionData> Promotion_1 data </PromotionData> <TotalA
<Header>
<Promotion>
<PromotionData>
Promotion_1 data
</PromotionData>
<TotalAmount>
Promotion_1 Amount
</TotalAmount>
</Promotion>
<Promotion>
<PromotionData>
Promotion_2 data
</PromotionData>
<TotalAmount>
Promotion_2 Amount
</TotalAmount>
</Promotion>
</Header>
每行行首的数字4
是该“寄存器类型”的ID,这是我需要放入
标记中的数据
标签的数据如下所示:
4baz PROMOTION_1 foo
4baz PROMOTION_1 foo
4baz PROMOTION_1 foo
4baz PROMOTION_2 foo
4baz PROMOTION_2 foo
4baz PROMOTION_2 foo
5PROMOTION_1 bar foo
5PROMOTION_2 bar foo
每行末尾的数字5
是该“寄存器类型”的ID
我正在读取这些数据并将它们分成不同的数组。。。我有数组1和数组2
使用公共值链接或循环这些数组的最佳形式是什么?每个PROMOTION_1
或PROMOTION_2
连接到其相应的数据,并获得与所需结构类似的输出
from lxml import etree
data1 = [('4baz', 'PROMOTION_1', 1),
('4baz', 'PROMOTION_1', 2),
('4baz', 'PROMOTION_1', 3),
('4baz', 'PROMOTION_2', 4),
('4baz', 'PROMOTION_2', 5),
('4baz', 'PROMOTION_2', 6)
]
data2 = [('5PROMOTION_1', 1, 2), ('5PROMOTION_2', 3, 4)]
root = etree.Element('Header')
for d1 in data1:
for d2 in data2:
if d1[1] in d2[0]:
promotion = etree.Element('Promotion')
root.append(promotion)
data = etree.Element('PromotionData')
data.text = f'{d1[1]} {d1[2]}'
promotion.append(data)
data = etree.Element('TotalAmount')
data.text = f'{d2[1]} {d2[2]}'
promotion.append(data)
out = etree.tostring(root, pretty_print=True)
print(out.decode('utf8'))
输出
<Header>
<Promotion>
<PromotionData>PROMOTION_1 1</PromotionData>
<TotalAmount>1 2</TotalAmount>
</Promotion>
<Promotion>
<PromotionData>PROMOTION_1 2</PromotionData>
<TotalAmount>1 2</TotalAmount>
</Promotion>
<Promotion>
<PromotionData>PROMOTION_1 3</PromotionData>
<TotalAmount>1 2</TotalAmount>
</Promotion>
<Promotion>
<PromotionData>PROMOTION_2 4</PromotionData>
<TotalAmount>3 4</TotalAmount>
</Promotion>
<Promotion>
<PromotionData>PROMOTION_2 5</PromotionData>
<TotalAmount>3 4</TotalAmount>
</Promotion>
<Promotion>
<PromotionData>PROMOTION_2 6</PromotionData>
<TotalAmount>3 4</TotalAmount>
</Promotion>
</Header>
推广1
1 2
推广1 2
1 2
推广1 3
1 2
推广2 4
3 4
推广2 5
3 4
推广2 6
3 4
您关心寄存器的类型吗?是的,但我只使用它来区分一种类型和另一种类型并创建数组。您的示例不清楚。Is'foo'与'foo'相同。或者“foo”可以是任何东西。它与“bar”和“baz”相同,第一个条目“4baz促销”与“5PROMOTION\u 1 bar foo”的关系如何?如果在此阶段寄存器的类型不重要,请将其去掉,并使用促销列将两个表连接在一起。这就是你想要的吗?很抱歉,foo和bar是虚拟数据,'foo'可以是任何东西,对于'bar'和'baz'是相同的。共同的价值观是提升1和提升2。