Python 如何通过公共值将数组链接到另一个数组

Python 如何通过公共值将数组链接到另一个数组,python,arrays,lxml,Python,Arrays,Lxml,我使用lxml通过Python中的纯文本数据创建了一个XML文档,但在将一个数组与另一个具有一个公共值的数组链接时遇到了问题。一个数组称为升级,另一个数组称为TotalAmount XML中的desire结构如下所示: <Header> <Promotion> <PromotionData> Promotion_1 data </PromotionData> <TotalA

我使用lxml通过Python中的纯文本数据创建了一个XML文档,但在将一个数组与另一个具有一个公共值的数组链接时遇到了问题。一个数组称为升级,另一个数组称为TotalAmount

XML中的desire结构如下所示:

<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。