[英]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)
首先使用列表理解提取R
和D
的名稱列表
>>> [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.