根据其他两个列表中的值创建列表

时间:2018-10-16 12:05:05

标签: python python-3.x list

假设我有两个看起来像这样的列表:

A = [(1,4), (5,2), (10, 8), (11, 3), (59, 14)]
B = [4, 2, 3, 4, 8, 14, 4, 2]

我想基于列表C和列表A创建一个名为B的新列表,以便C看起来像这样:

C = [(1,4), (5,2), (11,3), (1,4), (10,8), (59,14), (1,4), (5,2)]

也就是说,我想根据元组中的第二个值将B中的每个值与A中相应的元组中的第一个值链接。

我想可以通过如下的for循环来做到这一点:

C  = []
    for tuple in A:
        for number in B:
            if number == tuple[1]:
                C.append(tuple)

但是我认为这对于大型列表而言不是非常有效。

问题:是否存在一种更有效的创建列表C的方法?

谢谢!

4 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

A = [(1,4), (5,2), (10, 8), (11, 3), (59, 14)]
B = [4, 2, 3, 4, 8, 14, 4, 2]

a = {t[1]: t for t in reversed(A)}  # reverse to guarantee first tuple for each key
# {14: (59, 14), 3: (11, 3), 8: (10, 8), 2: (5, 2), 4: (1, 4)}

C = [a[x] for x in B]
#[(1, 4), (5, 2), (11, 3), (1, 4), (10, 8), (59, 14), (1, 4), (5, 2)]

您在tuple中建立了从第二个值到第一个A的映射,并在理解中使用了该映射。这样可确保您仅对AB进行一次迭代。

答案 1 :(得分:1)

您可以使用字典将元组中的第二项映射到第一项,然后使用该映射创建C

d = {b: a for a, b in A}
C = [(d[k], k) for k in B]

C将变为:

[(1, 4), (5, 2), (11, 3), (1, 4), (10, 8), (59, 14), (1, 4), (5, 2)]

答案 2 :(得分:0)

您应该首先创建第一个元组数组的字典,并以key作为第二个值,并将value作为元组。这具有 O(N)时间复杂度。现在,当您将其循环到第二个数字数组上时,便可以使用 O(1)时间复杂度的字典。因此,整个程序的总时间复杂度为 O(N) + O(M),其中N是元组的长度,M是数组的长度< / p>

@IBAction func startGame(_ sender: Any) {
     startGameButton.isHidden = true
}

答案 3 :(得分:0)

使用列表理解

<xs:complexContent>
  <xs:restriction base="IntList">
    <xs:sequence>
      <xs:element name="a" type="xs:int"/>
      <xs:element name="b" type="xs:int"/>
      <xs:element name="list">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="x" minOccurs="0" maxOccurs="5"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:restriction>
</xs:complexContent>