簡體   English   中英

如何比較 Python 中的兩個列表列表並找到匹配值

[英]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-44-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.

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