我有以下經過排序的圖元串列:
list1 = [(0.2, 'a'/span>), (0. 4, 'b'), (0.5, 'd')]
list2 = [(0.1, 'a'/span>), (0. 3, 'c'/span>), (0.7, 'x'/span>)]
list3 = [(0.5, 'c'), (0. 6, 'a'), (0.5, 'b') ]
我想根據常見的字母創建一個整體的排名串列,如下所示:
預期結果:
[(0. 9, 'a'/span>), (1.8, 'c'/span>), (1. 9, 'b'/span>), (2.5, 'd'/span>), (2.7, 'x'/span>) ]
是什么在起作用:
如果專案在三個串列中都是共同的,我就能得到預期的結果,但如果是其他情況,我就無法得到正確的結果。代碼片段
list1 = [(0.2, 'a'/span>), (0. 4, 'b'/span>), (0.5, 'd'/span>)]
list2 = [(0.1, 'a'), (0. 3, 'c'/span>), (0.7, 'x'/span>)]
list3 = [(0.5, 'c'), (0. 6, 'a'), (0.5, 'b') ]
priority_result = [] # when element is common in all 3 lists #when element is common in only two lists[/span].
result = [(s1, l1 l1) for (l1, s1), (l1, s2) in zip(list1, list2)]
print(result)
for (score, resultID) in list1:
for (score1, resultID1) in list2:
for (score2, resultID2) in list3:
if(resultID == resultID1 or resultID == resultID2)。
結果 = [(score score1 score2, resultID)] 。
priority_result.extend(result)
elif(resultID == resultID1 and resultID != resultID2)。
result = [(score score1 1, resultID)] 。
twos_array.extend(result)
我怎樣才能在此基礎上產生預期的結果呢?
uj5u.com熱心網友回復:
list1 = [(0.2, 'a'/span>), (0. 4, 'b'/span>), (0.5, 'd'/span>)]
list2 = [(0.1, 'a'), (0. 3, 'c'/span>), (0.7, 'x'/span>)]
list3 = [(0.5, 'c'), (0. 6, 'a'), (0.5, 'b') ]
d = {}
for t in list1 list2 list3:
d.setdefault(t[1], []).append(t[0] )
lst = [(sum(v, 3 - len(v), k) for k, v in d. items()]
print(lst) # [(0.9,'a'),(1.9,'b'),(2.5,'d'),(1.8,'c'),(2.7,'x')]/span>
uj5u.com熱心網友回復:
你可以交換圖元的順序來創建一個映射:
你可以交換圖元的順序。
d1 = dict(x[::-1] forx in list1)
d2 = dict(x[::-1] for X in list2)
d3 = dict(x[::-1] for X in list3)
現在你可以做一個鍵的聯合,因為dict.keys回傳一個set類物件:
keys = d1.key() | d2.key() | d3.key()
其余的可以用dict.get完成:
result = {k: d1.get(k, 1) d2. get(k, 1) d3.get(k, 1) for k in keys}.
將其轉化為一個排序的串列是很直接的:
sorted(x[::-1] forx in result.items()
假設你的串列是在一個元串列中了:
你的串列是在一個元串列中了。
lists = [list1, list2, list3] 。
keys = set() .union(*lists)
dicts = [dict(x[:: -1] for x in l) for l in lists ]
結果 = {k: sum(d. get(k, 1) for d in dicts) for k in keys}.
result = sorted(x[::-1] for X in result.items()
下面是一個稍微簡單的解決方案:
mapping = dict.fromkeys(set().union(*lists), len(list))
for v, k in itertools.chain.from_iterable(ists):
mapping[k] = v - 1
result = sorted(x[::-1] for x in result.items()
你可以使用collections.Counter來為你做大部分的數學運算:
c = Counter()
for lst in lists:
c.update({k: v - 1 for v, k in lst})
結果 = [(v len(lists), k) for k, v in c.items() ]
與普通的collections.defaultdict相同的事情是:
d = defaultdict(int)
for v, k in itertools.chain.from_iterable(list):
d[k] = v -1
結果 = [(v len(lists), k) for k, v in d.items()]
uj5u.com熱心網友回復:
你可以嘗試使用itertools.groupby與operator.itemgetter:
from itertools import groupby
from operator import itemgetter
x = list1 list2 list3
y = [l[1] for l in x] 。
print(sorted([(3 - y.count(key)) sum(next(zip(*l)), key) for key, l in groupby(sorted(x, key=ig(1)), key=ig(1))], key=ig(0)
[(0. 9, 'a'/span>), (1.8, 'c'/span>), (1. 9, 'b'/span>), (2.5, 'd'/span>), (2.7, 'x'/span>) ]
這段代碼將串列連接起來,并創建了另一個只有鍵的串列,并按鍵分組,對值進行匯總。此外,它還根據出現的次數來增加預期的值。
最后,它通過求和和修改的值進行排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/308548.html
標籤:
上一篇:轉換圖元串列和串列為字典
