假设我有两个看起来像这样的列表:
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
的方法?
谢谢!
答案 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
的映射,并在理解中使用了该映射。这样可确保您仅对A
和B
进行一次迭代。
答案 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>