簡體   English   中英

如何在具有條件的列表中查找匹配項

[英]How to find matching items in a list with a condition

給定的數據集:

P = {"alice": "R", "bob": "D", "carol": "D"}

V = {"alice": [True, True, False, True, None],
     "bob": [True, False, None, True, True],
     "carol": [False, False, False, None, None]}

我想得到以下結果:

#[('alice', 'bob', 2), ('alice', 'carol', 1)]

我們需要在“R”和“D”組合之間進行比較,找到共同的值並將其返回。

result = [['alice','bob',0],['alice','carol',0]]

for alice, bob, carol in zip(V.alice,V.bob,V.carol):
    if alice == bob:
        result[0][2] = result[0][2] + 1
    if alice == carol:
        result[1][2] = result[1][2] + 1

有很多方法可以做到這一點。 這是我使用的方法,
首先,您需要反轉p因為它是我認為最簡單的方法。 我為此使用了以下代碼:

p_r = {}
for a, b in p.items():
    if p_r.get(b):
        p_r[b] += [a]
    else:
        p_r[b] = [a]

然后像往常一樣開始比較:

k = []
for i in p_r['R']:
    for j in p_r['D']:
        s = [x == y and x is not None for x, y in zip(v[i], v[j])]
        k.append((i, j, s.count(True)))

最終代碼:

p = {"alice": "R", "bob": "D", "carol": "D"}

v = {"alice": [True, True, False, True, None],
     "bob": [True, False, None, True, True],
     "carol": [False, False, False, None, None]}

#  reverse dict p
p_r = {}
for a, b in p.items():
    if p_r.get(b):
        p_r[b] += [a]
    else:
        p_r[b] = [a]


k = []
for i in p_r['R']:
    for j in p_r['D']:
        s = [x == y and x is not None for x, y in zip(v[i], v[j])]
        k.append((i, j, s.count(True)))
        
print(k)

首先使用列表理解提取RD的名稱列表

>>> [k for k,v in P.items() if v=='D']
['bob', 'carol']
>>>[k for k,v in P.items() if v=='R']
['alice']

然后使用itertools.product從這些列表中找到組合

>>>import itertools
>>>list(itertools.product([k for k,v in P.items() if v=='D'],[k for k,v in P.items() if v=='R']))
[('bob', 'alice'), ('carol', 'alice')]

從字典V中為每個組合提取 boolean 值列表

>>>first_comb = ('bob', 'alice')
>>>[V.get(person) for person in first_comb]
[[True, False, None, True, True], [True, True, False, True, None]]

獲取列表之間的邏輯與(使用all() )結果的總和

>>>sum([all(elem) for elem in zip(*[V.get(person) for person in first_comb])])
2

結合所有

import itertools
P = {"alice": "R", "bob": "D", "carol": "D"}
V = {"alice": [True, True, False, True, None],
     "bob": [True, False, None, True, True],
     "carol": [False, False, False, None, None]}
combinations = list(itertools.product([k for k,v in P.items() if v=='D'],[k for k,v in P.items() if v=='R']))

output = [(*item,sum([all(elem) for elem in zip(*[V.get(person) for person in item])])) for item in combinations]
print(output)

o/p:-

[('bob', 'alice', 2), ('carol', 'alice', 0)]

暫無
暫無

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

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