Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-在列表中查找不同类型的公共元素_Python_Algorithm_Set - Fatal编程技术网

python-在列表中查找不同类型的公共元素

python-在列表中查找不同类型的公共元素,python,algorithm,set,Python,Algorithm,Set,我想知道Python是否提供了在不同列表中查找公共元素的便捷功能 假设我有两张名单 [1,2,[3,4]] and [1,3,[3,4]] 函数的理想输出应该是[1、[3,4]],一个包含公共元素的列表。困扰我的是嵌套列表[3,4]。如果没有它,我可以简单地做set(列表1)和set(列表2),这个问题将成为一个完全重复的问题。我知道这个问题可能看起来没有什么重复。当我在上面的例子中尝试同样的方法时,我得到一个错误提示: TypeError: unhashable type: 'list'

我想知道Python是否提供了在不同列表中查找公共元素的便捷功能

假设我有两张名单

[1,2,[3,4]] and [1,3,[3,4]]
函数的理想输出应该是[1、[3,4]],一个包含公共元素的列表。困扰我的是嵌套列表[3,4]。如果没有它,我可以简单地做set(列表1)和set(列表2),这个问题将成为一个完全重复的问题。我知道这个问题可能看起来没有什么重复。当我在上面的例子中尝试同样的方法时,我得到一个错误提示:

TypeError: unhashable type: 'list'
你知道怎么处理吗?
提前谢谢

以下命令和空闲会话的输出应有助于解决您的问题:

>>> a = [1,2,[3,4]]
>>> b = [1,3,[3,4]]
>>> [x for x in a if x in b]
[1, [3, 4]]
>>> A = [1,2,[3,4]]
>>> B = [1,3,[3,4]]
>>> [a for a in A if a in B]
[1, [3, 4]]

以下命令和空闲会话的输出应有助于解决问题:

>>> A = [1,2,[3,4]]
>>> B = [1,3,[3,4]]
>>> [a for a in A if a in B]
[1, [3, 4]]

在这种特殊情况下,可以使用
repr
,使列表的成员可散列:

>>> a = [1,2,[3,4]]
>>> b = [1,3,[3,4]]
>>> a_set = set(repr(x) for x in a)
>>> [x for x in b if repr(x) in a_set]
[1, [3, 4]]

在这种特殊情况下,可以使用
repr
,使列表的成员可散列:

>>> a = [1,2,[3,4]]
>>> b = [1,3,[3,4]]
>>> a_set = set(repr(x) for x in a)
>>> [x for x in b if repr(x) in a_set]
[1, [3, 4]]

您可以进行一些欺骗并生成一个helper函数(取决于您的Python版本):


但是我喜欢MRAB的答案…

您可以做一些欺骗并生成一个helper函数(取决于您的Python版本):


但是我喜欢MRAB的答案…

@MartijnPieters我刚开始键入:)如果你真的想做一个集合交集,你需要把你的内部列表转换成元组。如果对象不都是可散列的,但都是可排序的,你可以对两个列表进行排序并逐步通过它们,用O(nlog(n))代替O(nn)。这些列表在Python2中是可排序的,但不再在Python2中Python3@gnibbler你能更详细地解释一下如何在列表中逐步生成O(n*log(n))?@Jimster,见F.J的答案<如果b是
列表
元组
,则b中的code>x为O(n),但对于
dict
set
则为O(1)。因为你不能有一个包含列表的集合,如果你这样做的话,你必须使用o(n)搜索way@MartijnPieters我开始输入:)如果你真的想做一个集合交集,你需要把你的内部列表转换成元组,如果对象不都是可散列的,而是可排序的,您可以对这两个列表进行排序并单步遍历它们,使用O(nlog(n))代替O(nn)。这些列表在Python2中是可排序的,但不再在Python2中Python3@gnibbler你能更详细地解释一下如何在列表中逐步生成O(n*log(n))?@Jimster,见F.J的答案<如果b是
列表
元组
,则b中的code>x为O(n),但对于
dict
set
则为O(1)。因为你不能有一个包含列表的集合,如果你这样做的话,你必须使用o(n)搜索。这是个坏主意,
repr()
不一定会为两个比较相等的对象返回相同的结果。一个例子是集合和字典,其中显示的顺序是任意的,通常取决于插入顺序。这是一个坏主意,
repr()
不一定会为比较相等的两个对象返回相同的内容。一个例子是集合和字典,其中显示的顺序是任意的,通常取决于插入顺序。谢谢。。。但我从来没有用过空闲!谢谢但我从来没有用过空闲!