簡體   English   中英

比較兩個嵌套列表並返回公共元素

[英]Compare two nested lists and return common elements

我有兩個列表如下。

list1 = [["cup", "mug"], ["happy", "joy", "smile"], ["trees", "bushes"]]
list2 = [["cat", "dog"], ["trees", "bushes"], ["cup", "mug"]]

現在,我想返回兩個列表中的公共元素。

Common elements = [["trees", "bushes"], ["cup", "mug"]]

我嘗試了以下代碼:

print(list(set(list1).intersection(list2)))

但是,它不起作用。 有什么建議么?

您可能正在尋找:

In [773]: [list(x) for x in set(map(tuple, list1)).intersection(map(tuple, list2))]
Out[773]: [['trees', 'bushes'], ['cup', 'mug']]

您還可以使用&運算符(集合的交集運算符):

In [778]: [list(x) for x in set(map(tuple, list1)) & set(map(tuple, list2))]
Out[778]: [['trees', 'bushes'], ['cup', 'mug']]

您的代碼不起作用的原因是,您沒有將每個單獨的列表元素都轉換為set可以哈希的內容。 例如, tuple是可哈希的,而list則不是,因此您的方法給出:

In [774]: set(list1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-774-a09f7eaac729> in <module>()
----> 1 set(list1)

TypeError: unhashable type: 'list'

但是,將每個元素轉換為tuple可以對其進行哈希處理:

In [775]: set(map(tuple, list1))
Out[775]: {('cup', 'mug'), ('happy', 'joy', 'smile'), ('trees', 'bushes')}

原因是tuple是不可變的容器。

一個更簡單的方法是

[elem for elem in list1 if elem in list2]

你可以得到

>>> [elem for elem in list1 if elem in list2]
[['cup', 'mug'], ['trees', 'bushes']]

由於Python支持in運營商的list

您的問題的原因是, list是可變的,因此它不能是可哈希的,導致列表列表不能轉換為集合。 您可以按照@cᴏʟᴅsᴘᴇᴇᴅ所說將其轉換為tuple

[list(x) for x in set(map(tuple, list1)).intersection(map(tuple, list2))]

這兩種方法都可以使用,但是由於內部算法不同,它們的性能有所不同。 但是我認為很難說哪個更快,這可能取決於您的數據。

簡短版本的一定優勢是,如果需要此功能,則輸出數據的順序將與list1相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM