两个问题 . 我的代码包含两个列表
ListA = [[3, 5], [4, 4], [4, 5], [4, 6], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [6, 4], [6, 5], [6, 6], [7, 5]]
ListB =[[0, 4], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 4]]
我希望它输出两个列表之间的相似之处:
[[3,5][4,4][4,5][4,6][5,3][5,4][5,5][5,6][6,4]]
print(set(ListA]).intersection(ListB]))
没有用 . 还有其他方法吗?
2.我还希望它输出两个列表中找到的两个数字的每个括号的索引[0]中相似的数字 .
ListA
包含 [3,5][4,4][5,3][6,4]
ListB
包含 [3,1][4,2][5,2][6,4]
由于 3,4,5,6
在每个括号的索引[0](或第一个数字)中找到,因此输出将是 .
[3,4,5,6]
我该怎么办?
5 回答
你可以使用这样的列表理解:
它可能不是最快的方法,但除非您使用大型列表,否则它很好 .
列表不可清除,因此如果要使用
set.intersection
,则必须转换为tuple
1):并返回列表,如果你想:
一旦你有了这个,你就可以获得第二部分的第一个元素
set
.这看起来有点复杂,但使用
set
它比O(n)更快,比每个元素的整个列表中的线性搜索更快,为O(n²) .在不使用
set.intersection
的情况下,您还可以使用列表推导来过滤ListB
中也在ListA
中的那些元素(反之亦然),但同样,您应该将其他列表转换为set
,以便查找更快(O(1)而不是O(n)),为此,你再次必须转换为tuple
. (在这种情况下,您也可以转换为repr
并进行比较,但我尝试了两者并且tuple
似乎要快得多 . )这也具有保留
ListB
中元素的原始顺序的优点,并且也更快一些 . 或者,您可以创建一个字典,将列表中的第一个元素映射到相应的第二个元素的集合,然后使用列表解析,检查该字典是否存在该元素 .这应该同样快,即O(n),并且可能需要更少的内存来创建所有这些集合(取决于列表中的元素) .
1)或列表的任何其他明确的可清晰表示,但
tuple
似乎真的是唯一可行的选择 .frozenset
不关心元素的顺序,当你在交集后转换回repr
和eval
列表时,你真的不应该这样做 .您最初的想法不起作用,因为您不能将列表设置为集合,因为它们不可清除 . 一种简单的方法是将列表转换为元组:
您可以使用简单的嵌套循环 . 示例是here
第二部分有些困惑,你在找这个吗?
输出:
或者干脆:
输出: