[英]How can I compare two lists of lists in Python and find matching values
我正在嘗試根據每個列表的索引號比較兩個列表:
list1 = [
['1', ['a']],
['2', ['b', 'c', 'd']],
['3', ['e']],
['4', ['f', 'g']],
['5', ['h']]
]
list2 = [
['1', ['e']],
['2', ['f', 'c']],
['3', ['h', 'g', 'a', 'd']],
['4', ['b']],
['5', ['b']],
]
我想做的是將 list1 的每一行與 list2 中的所有行進行比較並返回匹配的值。 例如在這個例子中,理想的結果是
1(list1) - 3(list2),
2-2,
2-3,
2-4,
2-5,
3-1,
4-2,
4-3
一共8個。然后刪除相似的,比如:2-4和4-2,1-3和3-1。
您正在尋找“標簽” 乘積的集合交集,其中每對本身也是一個集合(如果2-4
和4-2
被認為是相同的,則順序無關緊要)。
使用 Python set
type最有效地測試交叉點,因此在構建這些字典時,讓我們預先將它們轉換為集合。
所以我們需要唯一的標簽,以及查找每個標簽的關聯列表的方法。 這是字典的工作,因此首先將您的列表轉換為字典,然后獲取它們的鍵的並集。 然后將每個配對也變成一個集合,因此{'2', '4'}
和{'4', '2'}
被視為相同,將結果存儲在另一個集合中。 請注意,在這種情況下, 2-2
變為2
,因為一個集合只會存儲'2'
一次。
然后我們要做的就是測試與選擇的鍵組合相關聯的兩個列表之間是否存在交集,如果有,則包括該組合:
from itertools import product
dict1 = {k: set(l) for k, l in list1}
dict2 = {k: set(l) for k, l in list2}
keys = dict1.keys() | dict2.keys() # all unique keys in both
found = {
frozenset((k1, k2))
for k1, k2 in product(keys, repeat=2)
if dict1.get(k1, set()) & dict2.get(k2, set())
}
演示:
>>> from itertools import product
>>> dict1 = {k: set(l) for k, l in list1}
>>> dict2 = {k: set(l) for k, l in list2}
>>> keys = dict1.keys() | dict2.keys() # all unique keys in both
>>> {
... frozenset((k1, k2))
... for k1, k2 in product(keys, repeat=2)
... if dict1.get(k1, set()) & dict2.get(k2, set())
... }
{frozenset({'3', '4'}), frozenset({'2'}), frozenset({'3', '5'}), frozenset({'2', '5'}), frozenset({'2', '3'}), frozenset({'2', '4'}), frozenset({'1', '3'})}
如果您必須有雙重引用,您可以對結果進行后處理:
for combo in found:
try:
a, b = combo
except ValueError: # doesn't contain 2 values, assume 1
a, = b, = combo
print(f'{a}-{b}')
順序將根據當前的隨機散列種子而有所不同,因此您可能需要使用排序。 我得到這個輸出:
3-4
2-2
3-5
2-5
2-3
2-4
1-3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.